Behat/Mink/PageObjects - 未找到页面对象 class

Behat/Mink/PageObjects - page object class not found

正在为我的项目设置 behat 测试...我得到了大部分工作 - 除了页面对象。这是我的 behat.yml

default:
  autoload: [%paths.base%/boostrap]
  suites:
    web:
      paths: [%paths.base%/features/web]
      contexts:
        - Web\LoginContext
    api:
      paths: [%paths.base%/features/api]
      contexts:
        - Api\ApiContext
  extensions:
    Behat\MinkExtension:
      base_url: http://my.url.com
      selenium2: ~
    SensioLabs\Behat\PageObjectExtension:
      namespaces:
        page: [Page]
        element: [Page\Element]

我正在关注PageObjectExtention documentation。我创建了 LoginPage class,它从 Page 扩展而来,并更新了我的上下文文件以使用页面注入。

我的登录页面 class 如下所示:

<?php

namespace Page;

use SensioLabs\Behat\PageObjectExtension\PageObject\Page;

class LoginPage extends Page
{

}

我的上下文文件如下所示:

namespace Web;

use Behat\Behat\Tester\Exception\PendingException;
use Page\LoginPage;

class LoginContext extends MednavMinkContext
{
    private $loginPage;

    public function __construct(LoginPage $homepage)
    {
        $this->loginPage = $homepage;
    }

    ...
}

然而,当我尝试 运行 它时,我得到

[ReflectionException]                
Class Page\LoginPage does not exist  

这些页面对象应该存储在哪里?我尝试了所有可能的位置 - 在 boostrap 中的 Page 下,在根目录中的 Page 下,以及其他几个 - 没有运气。

以下结构应该对您有所帮助:

  • tests/bootstrap -> 这里存储你所有的 *Context.php 文件
  • tests/bootstrap/Page -> 这里存储你所有的 *Page.php 文件

所有页面文件都应使用 namespace Page;

命名空间

文档说 here:

If you use namespaces with Behat, we’ll try to guess the location of your page objects. The convention is to store pages in the Page directory located in the same place where your context files are.

例如你有

RegisterPage.php

<?php

namespace Page;

use SensioLabs\Behat\PageObjectExtension\PageObject\Page;

/**
 * Class RegisterPage
 * @package Page
 */
class RegisterPage extends Page
{
    protected $path = '/register/';

}

和你的背景:

RegisterContext.php

<?php

use Behat\Behat\Context\Context;
use SensioLabs\Behat\PageObjectExtension\Context\PageObjectContext;

/**
 * Class RegisterContext
 */
class RegisterContext extends PageObjectContext implements Context
{
    /**
     * @Given /^I want to register a new account$/
     */
    public function iWantToRegisterNewAccount()
    {
        $this->getPage('Register Page')->open();
    }
}

最后是您的定义:

behat.yml

...

extensions:
    Behat\Symfony2Extension: ~

    SensioLabs\Behat\PageObjectExtension:
        namespaces:
            page:
                - Page

...

suites:
        account:
            paths:
                - %paths.base%/tests/behat/features/account
            contexts:
                - FixtureContext
                - FeatureContext
                - DefaultContext
                - RegisterContext

希望这就是您所需要的。

我最终解决了这个问题,使用 composer.json 中的 autoload 部分,现在看起来像这样:

{
    "require": {
        "behat/behat": "3.*@stable",
        "behat/mink": "1.6.*@stable",
        "behat/mink-extension": "@stable",
        "behat/mink-selenium2-driver": "@stable",
        "sensiolabs/behat-page-object-extension": "@stable"
    },
    "require-dev": {
        "phpunit/phpunit": "@stable",
        "bossa/phpspec2-expect": "@stable"
    },
    "config": {
        "bin-dir": "bin/"
    },
    "autoload": {
        "psr-4": {
            "": "lib/"
        }
    }
}

现在,在我的 lib 目录中,我有基于名称空间的常用目录结构:

lib/
    MyCompany/
        Util/
        Page/
        Config/

等等。最后,在我的 behat.yml 文件中,我为页面对象指定了命名空间:

SensioLabs\Behat\PageObjectExtension:
  namespaces:
    page: [MyCompany\Page]
    element: [MyCompany\Page\Element]