2009-07-29 38 views
3

有沒有辦法根據已經存在的對象創建一個模擬對象?例如,當單元測試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的設置,所以當我從零開始創建這些對象,它們的Id = 0。這對於單元測試是有問題的,因爲它們給控制器提供了不切實際的實體列表,其所有Id的設置爲0.

我真的很想能夠設置ID通過做類似於這些東西

new Country("United States", "US", "USA").SetID<Country>(3); * 

SetID將是對PersistedEntity擴展方法:

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; 
    } 

任何人都知道,如果有這樣的犀牛嘲笑一些神奇? *我懷疑有必要使這種方法是通用的,但如果不是,甚至更好。

回答

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, ... }; 

我在這裏假定Country不即密封,使RhinoMocks能夠產生的模擬那個班。

相關問題