Laravel 单元测试显示完全错误

Posted

技术标签:

【中文标题】Laravel 单元测试显示完全错误【英文标题】:Laravel unit testing show complete error 【发布时间】:2017-03-07 07:11:41 【问题描述】:

我正在尝试为我的laravel 5.2 项目创建一个测试,该测试将测试休息资源控制器中的注册页面。当我用我的测试的确切输入手动测试它时,一切正常,但是当我用phpunit 测试它时,我被重定向到一个错误页面,使我的页面断言失败。但是,该错误显示了断言失败的错误,而不是错误页面上的内容,因此没有显示测试失败的原因。我怎么能看到这个?

测试用例:

class registerTest extends TestCase

use WithoutMiddleware;

public function testRegisterCompanyCorrectly()

    $this->actAsAdmin();
    $this->visit('/Companies/create')
        ->type('testCompany', 'CName')
        ->type('www.testCompany.com', 'CUrl')
        ->type('testManager@gmail.com', 'Mail')
        ->type('John Doe', 'Name')
        ->type('Keith Richards', 'Password')
        ->type('Keith Richards', 'CPassword')
        ->press('Registreren')
        ->seePageIs('/Companies/3')
        ;


private function actAsAdmin()

    $user = User::find(1);
    $this->actingAs($user);

'

phpunit 错误:

There was 1 failure:

1) registerTest::testRegisterCompanyCorrectly
Did not land on expected page [http://localhost/Companies/3].

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://localhost/Companies/3'
+'http://localhost/Companies'

C:\Users\Stefan\Documents\producten\Applicatie\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:170
C:\Users\Stefan\Documents\producten\Applicatie\tests\registerTest.php:34
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:176
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:129

FAILURES!
Tests: 5, Assertions: 14, Failures: 1.

【问题讨论】:

它希望登陆 /companies/3 并改为登陆 /companies。您确定当您注册一家新公司时,您会登陆新创建资源的实际页面吗?如果我错了,请纠正我,但是将硬编码的数字传递给您的 seePageIs 方法看起来也很奇怪,因为这可能会随着每个新创建的资源而改变。 如果您遇到基本注册错误(错误值等),我的资源控制器会将您返回到创建页面。如果成功,它会将您发送到新公司 (/Companies/id) 的页面。但是,在制作页面时,我发现如果 laravel 遇到错误,它会重定向到 /Companies/ 并显示错误消息。问题是,无法手动重现它或显示错误,我找不到问题。此外,我目前使用数据库迁移和播种来准备测试,但一旦成功,我想重构它并确保没有硬编码值。 我对 phpunit 不是很有经验,但您可以尝试使用 --verbose 或 --debug 运行它,看看是否可以获得一些额外的信息。 如果您的应用程序确保用户只能由管理员用户创建,我敢打赌,您的迁移和种子无法在测试环境中创建用户。尝试暂时禁用此检查并再次运行测试。 这里的问题是您的测试不是单元测试。这是一个功能性测试,它应该验证某种功能的平静在一般情况下是否有效,但不会给你太多细节。如果您有一个单元测试来验证特定验证类是否按预期工作,那么您将获得有关实际错误的更详细信息。功能测试的重点是确保您知道您的应用程序的特定功能(用户注册)存在某些问题,以便您知道在哪里进行调查。 【参考方案1】:

调查错误的一种方法是在您的app/Exceptions/Handler.php 中激活Illuminate\Foundation\Validation\ValidationException 的错误报告。

protected $dontReport = [
    // ValidationException::class,
];

如果您再次运行测试,您的日志文件中应该有一个堆栈跟踪。

【讨论】:

以上是关于Laravel 单元测试显示完全错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel单元测试类未找到错误

Laravel 单元测试迁移失败

PHP单元,使用单元测试测试laravel日志消息

Laravel 5.5 中 PHP 单元测试中的类验证器错误

Laravel 5.2 单元测试错误:BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::make()

带有 Codeception 的 Laravel 4 模型单元测试 - 未找到“Eloquent”类