【发布时间】:2016-08-26 23:09:18
【问题描述】:
我正在尝试对各种自定义 FormRequest 输入进行单元测试。我找到了解决方案:
建议使用
$this->call(…)方法并用预期值(link to answer) 断言response。这太过分了,因为它直接依赖于 Routing 和 Controllers。Taylor 的测试,来自 Laravel 框架 found in
tests/Foundation/FoundationFormRequestTest.php。那里做了很多模拟和开销。
我正在寻找一种解决方案,我可以根据规则对单个字段输入进行单元测试(独立于同一请求中的其他字段)。
示例表单请求:
public function rules()
{
return [
'first_name' => 'required|between:2,50|alpha',
'last_name' => 'required|between:2,50|alpha',
'email' => 'required|email|unique:users,email',
'username' => 'required|between:6,50|alpha_num|unique:users,username',
'password' => 'required|between:8,50|alpha_num|confirmed',
];
}
所需的测试:
public function testFirstNameField()
{
// assertFalse, required
// ...
// assertTrue, required
// ...
// assertFalse, between
// ...
}
public function testLastNameField()
{
// ...
}
如何对每个字段的每个验证规则进行单独的单元测试(断言)?
【问题讨论】:
-
嗯,正如你所说,FormRequests 在 Laravel 中进行了测试,所以你不必再次测试它们,验证也在 Laravel 中测试。我真的没有得到你想要测试的东西......
-
所以是的,这就是我在第一条评论中想说的,验证规则已经在 Laravel 中测试过了。在您的示例中,您只想测试输入是否对您的规则集有效,但规则有效,这就是 Laravel 测试告诉我们的。我不确定是否有必要再次测试它。恕我直言,这与写
$this->assertEquals([ 'first_name' => 'required|between:2,50|alpha'....], (new FormRequest)->rules())相同 -
我希望根据设置为有效和无效输入的规则来测试输入
-
我对这个问题投了赞成票,并将所有其他类似问题重定向到这里。我希望它能帮助很多人。
-
@PeterPan666 当然,这适用于简单的规则。但是如果你结合规则并使用正则表达式等,那么事情就会变得更加复杂。我相信 Laravel 会根据正则表达式测试输入,但我不相信自己完全理解规则 API 并始终编写正确的正则表达式。有一种方法来测试它会很好。有人实际上为此写了一个包*,但我认为这应该是开箱即用的。 * github.com/mohammedmanssour/form-request-tester
标签: php laravel unit-testing request laravel-5.2