使用codeception和laravel

时间:2014-09-24 13:13:25

标签: selenium laravel vagrant codeception

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

接下来我通过composer安装了代码 我做了

  

codecept bootstrap

我将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运行时,它会在屏幕上引发错误:

  

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

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

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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;
}

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

$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')->...