Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有没有一种方法可以通过编程方式向behat功能提供变量?_Php_Unit Testing_Behat_Acceptance Testing - Fatal编程技术网

Php 有没有一种方法可以通过编程方式向behat功能提供变量?

Php 有没有一种方法可以通过编程方式向behat功能提供变量?,php,unit-testing,behat,acceptance-testing,Php,Unit Testing,Behat,Acceptance Testing,我想用behat彻底测试一组页面 例如,此场景概述: Scenario Outline: Given I am at <path> When I click some button Then I should see <hidden-stuff> | path | hidden-stuff | | path1 | element1 | | path1 | element2 | | path1 | element3 |

我想用behat彻底测试一组页面

例如,此场景概述:

Scenario Outline:
  Given I am at <path>
  When I click some button
  Then I should see <hidden-stuff>
  | path  | hidden-stuff |
  | path1 | element1     |
  | path1 | element2     |
  | path1 | element3     |
  | path2 | element1     |
  | path2 | element2     |
  | path2 | element3     |
  | path3 | element1     |
  | path3 | element2     |
  | path3 | element3     |
  ...
场景大纲:
考虑到我在
当我点击某个按钮时
那我该看看了
|路径|隐藏的东西|
|路径1 |元素1|
|路径1 |元素2|
|路径1 |元素3|
|路径2 |元素1|
|路径2 |元素2|
|路径2 |元素3|
|路径3 |元素1|
|路径3 |元素2|
|路径3 |元素3|
...
在我的具体案例中,我有10多个示例和50条路径,因此您可以看到这是如何变得极其笨拙的。我试图避免一个500行的不可维护特性,每次添加新路径或更多元素时都需要对其进行编辑

我可以将mysql查询的结果输入到“”参数中吗

或者在命令行上或通过环境提供“路径”

有没有更好的方法来解决这个问题


编辑:我确实找到了,它基本上把.feature文件(Gherkin)中的所有逻辑都转换成FeatureContext(PHP)。但这似乎不是一种对利益相关者友好的行为方式。这真的是最好的/唯一的方法吗?

这对您来说几乎是一个复制+粘贴的工作。我编写了一个自定义步骤定义
,因为页面内容对您来说是正确的。我还添加了一个
场景大纲
,作为一个经典示例,因此它们的功能相同,但您感兴趣的是自定义步骤定义

小黄瓜

Feature: Just testing

  Scenario Outline: Multiple generic visits
    Given I am on "<page>"
    Then I should see "<content>"
    Examples:
    | page              | content   |
    | /                 | HOME PAGE |
    | /login            | Username  |
    | /profile/step_one | Name      |

  Scenario: Multiple dynamic visits
    Given the page contents are correct

就像我担心的那样,你是在暗示,没有办法完全在小黄瓜的特征中做到这一点。e、 g.以一种对利益相关者友好的方式。小黄瓜的步骤是有限的,因此在边缘案例中,我们必须编写自己的步骤定义,而您的案例就是其中之一。如果我给你看我的上下文文件,你可能会哭!
namespace Application\FrontendBundle\Features\Context;

use Behat\MinkExtension\Context\MinkContext;
use Behat\Symfony2Extension\Context\KernelAwareContext;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\HttpKernel\KernelInterface;
use Exception;
use LogicException;

class FeatureContext extends MinkContext implements KernelAwareContext
{
    /* @var KernelInterface */
    private $kernel;

    public function setKernel(KernelInterface $kernelInterface)
    {
        $this->kernel = $kernelInterface;
    }

    /**
     * @Given /^the page contents are correct$/
     */
    public function thePageContentsAreCorrect()
    {
        $pageAndContent = $this->getPageAndContent();

        foreach ($pageAndContent as $page => $content) {
            try {
                $this->visitPath($page);
            } catch (Exception $e) {
                throw new LogicException(sprintf('The page "%s" does not exist.', $page));
            }

            try {
                $this->assertSession()->pageTextContains($this->fixStepArgument($content));
            } catch (Exception $e) {
                throw new LogicException(sprintf('The page "%s" does not contain "%s".', $page, $content));
            }
        }
    }

    /**
     * @return array
     */
    private function getPageAndContent()
    {
        /*
        $em = $this->getEntityManager();
        $repo = $this->getRepository($em, 'ApplicationFrontendBundle:Pages');

        $pageAndContent = [];
        $pages = $repo->findAll();
        foreach ($pages as $page) {
            // Build you array here
            $pageAndContent[$page->getUrl] = $page->getContent();
        }

        return $pageAndContent;
        */

        return [
            '/' => 'HOME PAGE',
            '/login' > 'Username',
            '/profile/step_one' => 'Name'
        ];
    }

    /**
     * @return EntityManager
     */
    private function getEntityManager()
    {
        return $this->kernel->getContainer()->get('doctrine')->getManager();
    }

    /**
     * @param EntityManager $entityManager
     * @param string        $serviceName
     *
     * @return EntityRepository
     */
    private function getRepository(EntityManager $entityManager, $serviceName)
    {
        return $entityManager->getRepository($serviceName);
    }
}