Behat / Mink / PageObjects - 找不到页面对象类

时间:2016-08-22 11:20:00

标签: behat mink pageobjects

使用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类,它从Page扩展并更新了我的上下文文件以使用页面注入。

我的LoginPage类如下所示:

<?php

namespace Page;

use SensioLabs\Behat\PageObjectExtension\PageObject\Page;

class LoginPage extends Page
{

}

我的Context文件如下所示:

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  

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

2 个答案:

答案 0 :(得分:0)

以下结构可以帮助您:

  • tests / bootstrap - &gt;这里存储所有* Context.php文件
  • tests / bootstrap / Page - &gt;这里存储所有* Page.php文件

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

进行命名空间

文档说here

  

如果你使用Behat的命名空间,我们会尝试猜测它的位置   你的页面对象。惯例是在页面中存储页面   目录位于上下文文件所在的相同位置。

所以例如你有

  

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

希望这就是你所需要的。

答案 1 :(得分:0)

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

{
    "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]