【问题标题】:Behat/Mink/PageObjects - page object class not foundBehat/Mink/PageObjects - 找不到页面对象类
【发布时间】:2016-08-22 11:19:59
【问题描述】:

使用 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  

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

【问题讨论】:

    标签: behat mink pageobjects


    【解决方案1】:

    以下结构应该可以帮助您:

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

    所有页面文件都应该使用namespace Page;命名空间

    文档说here:

    如果您在 Behat 中使用命名空间,我们将尝试猜测 您的页面对象。约定是将页面存储在Page中 目录位于您的上下文文件所在的同一位置。

    所以例如你有

    注册页面.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
    

    希望这是你需要的。

    【讨论】:

    • 这是 sensio 文档中建议的默认结构。不过,我确实更喜欢有不同的结构。不过我现在确实想通了 - 我会用该信息发布一个自我回答。
    【解决方案2】:

    我确实最终解决了这个问题,使用我的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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多