在Laravel 5.1上断言验证错误

时间:2016-09-20 19:36:36

标签: php laravel phpunit

您好我正在尝试为不依赖于视图的laravel控制器创建测试。我的控制器类中有以下方法:

public function store(Request $request)
{
    $this->validate($request,[
            'name'=>'required',
            'login'=>'required',
            'password'=>'required'
        ]);
    //TODO: Store to database
    return redirect('usuario/nuevo');
}

我找到以下代码来测试请求是否有任何错误:

public function testStore()
{
    $response=$this->call('GET','usuario.store');
    $this->assertSessionHasErrors();
}

因为我发送的请求没有填写必填字段,所以这个测试应该通过,但是PhpUnit会返回以下消息:

Session missing key: errors
Failed asserting that false is true.

我能使其发挥作用的唯一方法是尝试"看"通过进行如下测试的响应页面上的错误消息:

public function testStore()
{
    $this->visit('/usuario/nuevo')
        ->press('Crear')
        ->see('Whoops');
}

这对我来说不起作用有两个原因:1)测试取决于视图"按"按钮并发送请求(我希望在不同的测试中对此进行测试并严格保留此控制器)和2)测试取决于'哎呀'要出现的字符串,这显然是不好的做法。

我找到了几个答案,声称第一个测试代码应该可行,但它根本就没有。

2 个答案:

答案 0 :(得分:2)

尝试使用会话启动并发送空参数

       $this->startSession();
       $this->call('GET','usuario.store', array(
        'name' => '',
        'login' => '',
        'password' => ''
    ));
    $errors = session('errors');
    $this->assertSessionHasErrors();
    $this->assertEquals($errors->get('name')[0],""your custom error message);// only for checking exact message

答案 1 :(得分:0)

您的问题是您没有测试您认为自己正在测试的内容。

要执行控制器的商店(),你应该使用POST方法而不是GET,除非你的路线真的很奇怪。