【问题标题】:Working with codeception and laravel使用 codeception 和 laravel
【发布时间】:2014-09-24 13:13:25
【问题描述】:

我现在在代码接收方面有点挣扎。 我从事一个 laravel 4 项目。从现在开始,我们使用 PhpUnit 进行正常的 uni 测试,但是我们的页面中有太多的 Javascript 无法使用简单的 DomCrawler 进行验收测试,这是没有意义的。 首先,我在 vagrant VM 上安装了 selenium + chrome。花了我一些时间,但我设法让它工作,这意味着我可以浏览 Webdriver 网页(/wd/hub),然后使用 chrome 成功创建一个新会话。

接下来我通过 composer 安装了 codeception 我做了

codecept 引导程序

我将 Laravel4 作为模块添加到acceptance.suite.yml

class_name: AcceptanceTester
modules:
    enabled:
        - WebDriver
        - AcceptanceHelper
        - Laravel4
    config:
        WebDriver:
            url: 'https://192.168.33.10/'
            browser: 'chrome'

我做了一个 codecept 构建。 然后我写了一个非常简单的acceptanceTest来检查一切是否正常:

$I = new AcceptanceTester($scenario);
$I->am('a member');
$I->wantTo('connect');
$I->amOnRoute('login');
$I->see('someText');

当我运行 codecept 时,它会在屏幕上引发错误:

[逻辑异常] 在迭代 Finder 之前,您必须调用 in() 或 append() 方法之一。

在 Selenium WebDriver Page 中,它说已经创建了一个 chrome 会话。

我对这个错误进行了一些搜索。它来自 Symfony 的 Finder 组件。

有人可以帮助我吗?

【问题讨论】:

    标签: selenium laravel vagrant codeception


    【解决方案1】:

    您必须选择是否要将 WebDriver 或 Laravel4 作为您的“浏览器”,不幸的是您不能同时拥有这两者,这可能是您的问题的根源。如果你需要 Javascript,你可能需要保留 WebDriver 并放弃一些 Laravel 功能,但在我看来并不多。如果你真的需要 Laravel,这是我创建的一个帮助器,用于将它放入 _support/FunctionalHelper:

    public function getLaravel4()
    {
        if ( ! isset($this->laravel4))
        {
            $this->laravel4 = (new \Codeception\Module\Laravel4());
    
            $this->laravel4->kernel = app();
        }
    
        return $this->laravel4;
    }
    

    所以在你的测试中你只需要:

    $L = $I->getLaravel4();
    

    但是,请记住,由于 Laravel 不是您的浏览器,因此:

    $L->amOnRoute('login');
    

    不会工作,但您可以做与浏览无关的事情,例如:

    $L->seeRecord('users', [
        'email' => 'a@b.com',
        'first_name' => 'a',
        'last_name' => 'b'
    ]);
    

    另外,你可以在你的 _bootstrap 文件上启动 laravel:

    include __DIR__ . '/../vendor/autoload.php';
    $app = require_once __DIR__ . '/../bootstrap/start.php';
    $app->boot();
    

    并且可以直接访问 IoC 容器:

    $app = app();
    
    $app['config']->get('...');
    

    甚至外墙:

    DB::table('users')->...
    

    【讨论】:

    • 哈哈!谢谢。编辑以显示一种启动 Laravel 并直接访问 IoC 的方法。
    • 很有趣,当我看到你的帖子时,我也在破解 _bootstrap。在这些事情上你似乎比我快......再次感谢
    • 这是一个值得+2的专家答案,它解决了我在使用 Laravel5 模块时遇到的一个相关问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 2017-09-17
    • 2014-07-31
    • 1970-01-01
    • 2014-09-14
    • 2016-10-19
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多