Vagrant,Codeception& Laravel问题。 NotFoundHttpException

时间:2014-02-23 23:10:44

标签: php unit-testing laravel laravel-4 codeception

我正在尝试使用codeception进行验收测试。

我的一项测试有以下内容:

<?php
use Codeception\Util\Stub;

class SomeTest extends \Codeception\TestCase\Test
{

    protected $webGuy;

    /**
     * @test
     */
    public function incorrect_login_should_redirect_back()
    {
        $I = $this->webGuy;
        $I->wantTo('fail at logging in');
        $I->amOnPage('/'); // <-- This is the line that is failing
        $I->fillField('email','info@tntstudio.hr');
        $I->fillField('password','pass');
        $I->click('Login');
        $I->see('email', 'input');
        $I->seeCurrentUrlEquals('/login');
    }

}

最初测试运行正常,但是在将Laravel4添加到acceptance.suite.yml文件并运行build后,测试现在失败并显示以下内容:

1) SomeTest::incorrect_login_should_redirect_back
Symfony\Component\HttpKernel\Exception\NotFoundHttpException: 

#1  /Applications/MAMP/htdocs/hired/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1021
#2  /Applications/MAMP/htdocs/hired/vendor/laravel/framework/src/Illuminate/Routing/Router.php:989
#3  /Applications/MAMP/htdocs/hired/vendor/laravel/framework/src/Illuminate/Routing/Router.php:968
#4  /Applications/MAMP/htdocs/hired/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:738
#5  /Applications/MAMP/htdocs/hired/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:708
#6  /Applications/MAMP/htdocs/hired/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
#7  /Applications/MAMP/htdocs/hired/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:325
#8  /Applications/MAMP/htdocs/hired/app/tests/acceptance/WebGuy.php:476
#9  /Applications/MAMP/htdocs/hired/app/tests/acceptance/SomeTest.php:16

我正在使用vagrant在http://localhost:3030/

的虚拟环境中运行我的应用

我已将此设置为PhpBrowseracceptance.suite.yml配置的网址,如下所示:

class_name: WebGuy
modules:
    enabled:
        - PhpBrowser
        - WebHelper
        - Laravel4
    config:
        PhpBrowser:
            url: 'http://localhost:3030/'

我想知道是否有其他人遇到过这个问题,或者对于如何解决这个问题有任何想法,我已经在这里扯了几个小时。

3 个答案:

答案 0 :(得分:5)

Laravel4模块将导致Codeception使用Laravel中的“测试”环境。

Laravel将在“测试”环境中禁用所有路由过滤器 - 因此您的过滤器无法正常工作,并且可能调用了错误的路由,导致您的应用程序死亡并且您的测试失败。

我不认为使用带有“验收”测试的Laravel4模块是正确的 - 它应该仅用于功能测试? 编辑:我刚刚发现Codeception Laravel4模块文档实际上说“这个模块允许你为Laravel 4运行功能测试” - 所以我猜它实际上并不是为验收测试而设计的?

但是对于Codeception 2.x中的所有更改 - 最好使用PhpBrowser模块进行验收测试,并使用Laravel4模块进行功能性测试。

如果您正在使用Homestead,我会在start.php文件中执行此操作以检测Codeception是否正在运行,并特别将其置于'codeception'环境中,否则我会让它正常运行我的环境检测

if ((gethostname() === 'homestead') && (isset($_SERVER['REMOTE_ADDR'])) && ($_SERVER['REMOTE_ADDR'] === '127.0.0.1'))
{
    $env = $app->detectEnvironment(['codeception' => ['homestead']]);
}
else
{
    $env = $app->detectEnvironment(['dev' => ['homestead']]);
}

然后在我的'codeception'环境中,我设置了一个SQLite文件数据库,并针对它运行验收测试(这比mySQL测试更快)。

答案 1 :(得分:3)

您甚至无需更改start.php。您可以在laravel4模块配置中设置codecption的环境。因此,在acceptance.suite.yml中,它将如下所示:

modules: enabled: [PhpBrowser, WebHelper, Laravel4] config: Laravel4: environment : 'codeception' filters : true

现在,当您在终端中执行php codecept run acceptance时,Laravel4模块将使用app/config/codeception中的配置文件。

答案 2 :(得分:0)

无法找到解决方案,所以现在我很遗憾没有Laravel4模块,遗憾的是。