2009-07-29 57 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能够产生的模拟那个班。

相关问题