【问题标题】:Laravel validation, how to test/TDD?Laravel 验证,如何测试/TDD?
【发布时间】: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


【解决方案1】:

您可能希望模拟 Validation 对象,并且在您的模拟中,您可以为失败的验证提供简单的行为并针对该行为进行断言。

您可以使用Mockery 之类的工具在您的测试中创建简单的模拟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2011-11-16
    • 2012-06-29
    • 2021-12-05
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多