다음 함수를 테스트하고 싶다고 가정 해 보겠습니다.아음속 지연로드 속성은 어떻게 단위 테스트합니까?
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
_emailService.SendEmail(order.User.Email, "Your order has been cancelled!");
}
이제 Order 클래스는 SubSonic에서 생성 한 클래스이고 그 위에 User 속성은 지연로드되어 있습니다. 즉, order.User를 호출 할 때이를 의미합니다. 전자 메일로 실제로 SQL 문을 실행하여 사용자를 가져옵니다.
만약 내가 단위 테스트를 원한다면, 나는 정말로 내 단위 테스트가 내 데이터베이스를 치는 것을 원하지 않기 때문에 문제가있을 것이다.
내 현재 솔루션을 다음과 같이 CancelOrder 함수를 리팩토링 할 수 있습니다.
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
User user = _userRepository.GetByUserID(order.UserID);
_emailService.SendEmail(user.Email, "Your order has been cancelled!");
}
그런 다음 _customer 개체를 반환하도록 _userRepository.GetUserByID() 호출을 스텁 (stub) 할 수 있습니다.
이렇게하는 것이 가장 좋은 방법입니까? 모든 데이터 액세스가 속성 내에서 숨겨진 대신 리포지토리를 통해 수행되기 때문에 두 번째 구현이 더 깨끗하다고 주장 할 수 있습니다.