我试图通过单元测试来测试我的一些控制器。但是有一些奇怪的事情发生了。在我的测试用例中使用以下代码:
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';
答案 0 :(得分:2)
我不会停止重复这个问题。有similar answer到(有点)类似的问题。 TL; DR:don't use unit testing framework for functional / integration testing。
这是功能测试领域,有一个神话般的框架 叫Behat。你应该做自己的研究,但基本上,同时 PHPUnit非常适合测试或多或少的独立块 功能很糟糕,测试更大的事情,如完整的请求 执行。稍后您将开始遇到会话问题 错误,错误配置的环境等,都是因为每个请求都是 应该在它自己独立的空间中执行并强制它 反其道而行之。另一方面,Behat非常适合工作 不同的方式,每个场景的位置(后机器人,视图不存在 页面),它向服务器发送一个新的请求并检查结果。 它主要用于最终测试一起工作的所有东西 在最终结果上做出断言(响应对象/ html / json)。
如果您想以正确的方式测试代码,请考虑使用正确的工具。一旦你了解了Behat,你就会爱上它+你可以在Behat中使用PHPUnit来做出单独的断言。