【问题标题】:Vagrant, Codeception & Laravel issue. NotFoundHttpExceptionVagrant、Codeception 和 Laravel 问题。 NotFoundHttpException
【发布时间】:2014-03-25 10:05:16
【问题描述】:

我正在尝试使用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/

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

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

我想知道是否有其他人遇到过这个问题,或者对如何解决这个问题有任何想法,我已经为此烦恼了好几个小时。

【问题讨论】:

  • 我运行了与您类似的设置,但在我的验收套件中,我只启用了 PhpBrowser、WebHelper 和 DB。我不使用 Laravel4 模块,您需要它们进行验收测试吗?
  • 我自己需要它们,毫无疑问,不用 Laravel4 模块也可以逃脱,但我想使用它提供的方法。
  • 也许在路由文件上放一个调试日志,看看它实际上“试图”命中哪个路由来生成http异常?我认为您获得 symfony 异常的事实意味着您至少正在通过测试“命中”您的应用程序?
  • 您的config/app/app.php 文件是否设置了正确的URL?您可能会发现您还需要带有 :3030 的完整 URL。
  • @alexrussell 是的,我试过了,没有帮助

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


【解决方案1】:

您甚至不必更改您的start.php。您可以在 laravel4 模块配置中设置编解码器的环境。所以在你的acceptance.suite.yml 中它看起来像这样:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    但随着 Codeception 2.x 的所有变化 - 您最好使用 PhpBrowser 模块进行 acceptance 测试,并使用 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 测试更快)。

    【讨论】:

    【解决方案3】:

    无法找到解决此问题的方法,因此遗憾的是,现在我将不使用 Laravel4 模块。

    【讨论】:

    • 我想我明白了。我已经为你发布了一个新的答案。
    猜你喜欢
    • 2023-03-28
    • 2013-03-19
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2014-07-25
    相关资源
    最近更新 更多