2016-12-03 56 views
1

我应该如何组织验证在Laravel是能够测试/ TDD?Laravel验证,如何测试/ TDD?

我想我需要从服务中抛出ValidationException而不是在控制器中做某些事情,以便能够在单元测试中断言它。

例如,我有changePassword($user, $password, $newPassword)方法UserService,我需要检查$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响应,会话...)?

+1

验证的服务水平?我在处理请求的控制器中执行此操作。在服务中做这件事有什么好处? – jcorry

+0

@jcorry你如何测试它?仅在验收测试级别(如执行POST请求并检查响应/会话中的错误)?我试图在单元测试中做到这一点。也认为一些服务方法可能在几个地方使用,所以它会避免代码重复。 – AlexP11223

+1

是的,控制器代码将通过验收/集成测试进行最佳测试。那就是你要测试验证的地方。 – jcorry

回答

-1

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

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