2016-12-03 96 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這樣的工具在您的測試中創建簡單的模擬。