使用codeception和laravel

elf*_*fif 1 selenium vagrant laravel codeception

我现在正在努力解决代码问题.我参与了一个laravel 4项目.从现在开始,我们使用PhpUnit进行单向测试,但是我们的页面中有太多的Javascript用简单的DomCrawler进行验收测试,这是没有意义的.首先,我在流浪汉VM上安装了selenium + chrome.花了我一些时间,但我设法让它工作,这意味着我可以浏览Webdriver网页(/ wd/hub),然后使用chrome成功创建一个新的会话.

接下来,我通过作曲家安装了代码

codecept bootstrap

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

class_name: AcceptanceTester
modules:
    enabled:
        - WebDriver
        - AcceptanceHelper
        - Laravel4
    config:
        WebDriver:
            url: 'https://192.168.33.10/'
            browser: 'chrome'
Run Code Online (Sandbox Code Playgroud)

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

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

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

[LogicException]在迭代Finder之前,必须调用in()或append()方法之一.

在Selenium WebDriver页面中,它表示已创建了一个chrome会话.

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

有人可以帮助我吗?

Ant*_*iro 6

您必须选择是否要将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;
}
Run Code Online (Sandbox Code Playgroud)

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

$L = $I->getLaravel4();
Run Code Online (Sandbox Code Playgroud)

但是,请记住,因为Laravel不是您的浏览器,例如:

$L->amOnRoute('login');
Run Code Online (Sandbox Code Playgroud)

不起作用,但你可以做与浏览无关的事情,比如:

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

此外,您可以在_bootstrap文件上启动laravel:

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

并可以直接访问IoC容器:

$app = app();

$app['config']->get('...');
Run Code Online (Sandbox Code Playgroud)

甚至外墙:

DB::table('users')->...
Run Code Online (Sandbox Code Playgroud)