【发布时间】:2017-04-18 06:38:55
【问题描述】:
我应该如何在 Laravel 中组织验证以便能够测试/TDD?
我认为我需要从服务中抛出 ValidationException 而不是在控制器中执行某些操作,以便能够在单元测试中对其进行断言。
例如我在UserService 中有changePassword($user, $password, $newPassword) 方法,我需要检查$password 是否正确以及$newPassword 是否为空等。
我应该像这里https://stackoverflow.com/a/23595760/964478 那样做吗?通过Validator::make 在某处创建验证器并
if ($validator->fails())
{
throw new ValidationException($validator);
}
在单元测试中
public function should_not_change_password_if_incorrect_current_password()
{
$user = ......;
$this->expectException(ValidationException::class);
$this->userService->changePassword($user, 'incorrect', 'newPassword');
}
还是有更好的方法?
或者我不应该对其进行单元测试而只进行验收测试(检查 HTTP 响应、会话……)?
【问题讨论】:
-
服务级别的验证?我在处理请求的控制器中执行此操作。在服务中这样做有什么好处?
-
@jcorry 你如何测试它?仅在验收测试级别(例如执行 POST 请求并检查响应/会话中的错误)?我试图在单元测试中做到这一点。也想到了一些服务方法可能会用到多个地方,这样就可以避免代码重复了。
-
是的,控制器代码最好通过验收/集成测试进行测试。这就是您测试验证的地方。
标签: php laravel validation unit-testing laravel-5.3