使用多种方法时,Laravel Unit测试控制器错误

时间:2014-09-16 13:51:40

标签: php unit-testing laravel phpunit

我试图通过单元测试来测试我的一些控制器。但是有一些奇怪的事情发生了。在我的测试用例中使用以下代码:

public function test_username_registration_too_short()
{
    $result = $this->action('POST', 'App\\Controllers\\API\\UserController@store', null, [
        'username' => 'foo'
    ]);
    $this->assertEquals('not_saved', $result->getContent());

// $result = $this->action('POST', 'App\\Controllers\\API\\UserController@store', null, [
//      'username' => 'foo'
// ]);
// $this->assertEquals('not_saved', $result->getContent());
}

public function test_username_registration_too_short_run_2()
{
    $result = $this->action('POST', 'App\\Controllers\\API\\UserController@store', null, [
        'username' => 'foo'
    ]);
    $this->assertEquals('not_saved', $result->getContent());
}

当我运行它时,初始的too_short测试通过,但是第2次运行的完全相同的代码没有通过(它甚至设法保存用户)。但是,如果我在相同的方法中将相同的代码放两次(现在注释掉了)它完美地工作了吗?我的setUp或tearDown方法中没有任何内容。而我在这里有点迷失。

控制器中的代码如下:

$user = new User(Input::all());
if($user->save())
{
    return 'saved';
}
return 'not_saved';

1 个答案:

答案 0 :(得分:2)

我不会停止重复这个问题。有similar answer到(有点)类似的问题。 TL; DR:don't use unit testing framework for functional / integration testing

  

这是功能测试领域,有一个神话般的框架   叫Behat。你应该做自己的研究,但基本上,同时   PHPUnit非常适合测试或多或少的独立块   功能很糟糕,测试更大的事情,如完整的请求   执行。稍后您将开始遇到会话问题   错误,错误配置的环境等,都是因为每个请求都是   应该在它自己独立的空间中执行并强制它   反其道而行之。另一方面,Behat非常适合工作   不同的方式,每个场景的位置(后机器人,视图不存在   页面),它向服务器发送一个新的请求并检查结果。   它主要用于最终测试一起工作的所有东西   在最终结果上做出断言(响应对象/ html / json)。

如果您想以正确的方式测试代码,请考虑使用正确的工具。一旦你了解了Behat,你就会爱上它+你可以在Behat中使用PHPUnit来做出单独的断言。