2009-02-12 8 views
6

코드에서 null 검사를 피하기 위해 메서드가 결과가 나타나지 않을 때 null 대신 항상 빈 목록이나 배열을 반환하는 것이 좋습니다.Rhino Mocks에서 빈 목록 반환 기본적으로 빈 목록 반환

Rhino Mocks는 목록 및 배열에 대해 null 인 개체의 기본값을 반환하기 때문에 null 체크를 다시 추가하거나 예상치 못한 목록을 반환하도록 설정해야합니다.

Rhino Mocks를 구성하거나 확장하는 방법이 있습니까?

var repositoryMock = MockRepository.GenerateMock<ICustomerRepository>(); 
IList<Customer> customers = repositoryMock.getCustomers(); 

Assert.IsNotNull(customers); 
Assert.AreEqual(0, customers.Count); 

답변

0

반환 된 개체가 IEnumerable 인 경우 Moq 일 때이 동작이 가능하다는 것이 나타났습니다. 다음 테스트는 통과합니다.

0

Rhino Mocks에는 문제를 자동으로 해결하는 방법이 없습니다. 가장 간단한 해결책은 SetupResult (또는 repeat.any)를 사용하여 기본값을 구성하는 각 유형에 대해 확장/유틸리티 메소드를 설정하는 것입니다.

ILists/Arrays를 확인하고 동적으로 mock을 설정하여 멤버를 통해 항상 열거 할 수 있습니다.이 유틸리티 메소드에 할당 할 수있는 유형의 수와 유형의 수에 따라 다릅니다.

행운을 빈다.

-1

기본값이 아닌 값을 반환하는 mock의 기본 동작을 변경하면 위험 할 수 있습니다.

실제 구현에서 ICustomerRepository에 버그가있어서 빈 목록을 반환하지 않고 null을 반환하면 어떻게됩니까?

다른 단위 테스트를 작성하고 빈 목록을 자동으로 반환 한 ICustomerRepository의 모의 버전에 대해 테스트 한 경우 모든 사항이 정상이라고 생각할 수 있습니다. 이 코드를 작성하여 제대로 작동한다고 생각해도 컴파일 된 앱을 실행하면 충돌이 시작됩니다.

왜? ICustomerRepository에 충돌 한 클래스가 null을 올바르게 처리하지 못했기 때문입니다.

필자는 모의 안에서 뭔가 "마법"이 발생하는 것보다 getCustomers() 메서드에서 빈 IList를 반환하는 테스트에서 많은 것을 분명하게 명시하고 기대를 설정했습니다. 왜? 코드 가독성을 향상시키고 코드가 rhino와 친숙하지 않은 다른 개발자가 작동하도록 기대하는 것에 따라 작동하기 때문입니다. 즉 기대가없는 방법은 기본값을 반환합니다.

+1

ICustomerRepository가 null을 반환하면 응용 프로그램이 중단되지만 이는 저장소를 사용하는 클래스가 아니라 저장소의 버그입니다. 나는 (잘하면 :)) 그 문제를 잡기 위해 저장소에 대한 단위 테스트를하고 싶습니다. – Dala

+0

나는 평소보다 모의 마술과 함께 살 수있다. :) 차라리 나머지 시스템만큼 행동하게하십시오. 의견을 보내 주셔서 감사합니다! – Dala