2009-07-29 2 views
3

이미 존재하는 객체를 기반으로 mock 객체를 만드는 방법이 있습니까? 예를 들어 ASP.NET MVC 응용 프로그램을 단위 테스트 할 때 저장소 방법을 조롱하는 문제 (예 : GetAll)가 자주 발생합니다. 보통 나는 다음과 같이 몇 가지 테스트 데이터를 반환하기 위해이 방법을 얻으려면 :이미 존재하는 객체의 일부를 조롱 할 수 있습니까?

private List<Country> CreateCountries() 
    { 
     return new List<Country> { 
           new Country("Australia", "AU", "AUS"), 
           new Country("Canada", "CA", "CAN"), 
           ... 
           }; 
    } 

내 기업이 모든는 Id 속성을 가진 PersistedEntity 기본 클래스에서 파생 객체 있지만 그렇게 할 때, NHibernate에 의해 설정 될 수있다 Idle = 0 인이 객체들을 처음부터 만듭니다. 이것은 단위 테스트에서 문제가되는데, 그 이유는 컨트롤러가 ID가 모두 0으로 설정된 비현실적인 엔티티 목록을 제공하기 때문입니다.

ID를 설정할 수 있기를 정말로 바랍니다. 이런 일을해서이 물건들에.

new Country("United States", "US", "USA").SetID<Country>(3); * 
코뿔소 모의 객체에서 그런 마법이 있다면

public static T SetID<T>(this T entity, int id) where T : PersistedEntity 
    { 
     var mocks = Mocker.Current; 

     // Some kind of magic happens here that creates a mocked version of 
     // entity (entity2), which has the same values as the original entity 
     // object but allows us to set up new expectations on it like... 

     Expect.Call(entity2.Id).Return(id); 

     return entity2; 
    } 

누구나 알고 SetIDPersistedEntity에 확장 방법이 될 것입니다

?

*이 방법을 일반적으로 만들 필요가 있다고 생각하지만 그렇지 않은 경우 더 좋습니다.

답변

1

나는 당신의 문제를 제대로 이해 한 경우처럼 할 수 있어야 다음

var country = MockRepository.GenerateMock<Country>("Australia", "AU", "AUS"); 

... 

country.Stub(c => c.Id).return(5); // whatever arbitrary id you want to give it 

... 

return new List<Country> { country, ... }; 

나는 RhinoMocks가의 모의를 생성 할 수 있도록 Country 즉 밀폐되지 않도록 여기에 가정 한 그 계급.