使用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
下的根目录中,以及其他几个 - 没有运气。
答案 0 :(得分:0)
以下结构可以帮助您:
所有页面文件都应使用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]