有没有办法根据现有对象创建模拟对象?例如,在单元测试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的不切实际的实体列表。
我真的希望能够通过执行类似
的操作来设置这些对象的IDnew 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;
}
任何人都知道Rhino Mocks中是否有类似神奇的东西?
*我怀疑有必要将此方法设为通用,但如果没有,则更好。
答案 0 :(得分: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能够生成该类的模拟。