正如标题中所说,我遵循模型优先方法。所以我的模型类是自动生成的。如果我想模拟包含实体类的DBContext
派生类。阅读一些地方,为了进行单元测试,您需要将其更改为. 是否可以这样做,尤其是在我执行“运行自定义工具”时自动生成的类中是一个问题。但截至目前,我对其进行了修改。MyModelContainer
DBSets
IDBSet
但真正的问题是:当我尝试 StubMyModelContainer
返回一个从IDBSet
. Rhino 模拟正在触发 InvalidOperationException:“无效调用,已使用最后一次调用,或未进行任何调用(确保您正在调用虚拟(C#)/可覆盖(VB)方法。”
这是我的单元测试代码。
MyModelContainer dbMock = MockRepository.GenerateMock<MyModelContainer>();
IDBSet<Models.MyEntity> entityMock = MockRepository.GenerateMock<IDBSet<Models.MyEntity>>()
dbMock.Stub( x=>x.MyEntities ).Return( entityMock );
最后一条语句触发了异常。我尝试使用此处IDBSet<>
指定的假实现,但没有运气!
我使用 MVC 4,Rhino Mocks 3.6。任何帮助将不胜感激。
更新:
经过一些试验和研究,我找到了解决办法。我将代码更改为:
MyModelContainer dbMock = MockRepository.GenerateMock<MyModelContainer>();
IDBSet<Models.MyEntity> entityMock = MockRepository.GenerateMock<IDBSet<Models.MyEntity>>()
//dbMock.Stub( x=>x.MyEntities ).Return( entityMock );
dbMock.MyEntities = entityMock;
现在InvalidOperationException
没有了。测试失败只是因为ExpectationViolationException
这应该是正常的。
至于自动生成的模型类,发现编辑DbContext's
T4 模板(.tt 扩展名)就可以了。感谢艾伦的博客
但我想知道为什么以前的代码不起作用。任何人?