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]
正在为我的项目设置 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]