【发布时间】:2013-03-20 06:13:36
【问题描述】:
正如标题中所说,我遵循模型优先方法。所以我的模型类是自动生成的。如果我想模拟包含DBSets 实体类的DBContext 派生MyModelContainer。阅读一些内容以进行单元测试,您需要将其更改为IDBSet。是否可以这样做,尤其是在我执行“运行自定义工具”时自动生成的类中是一个问题。但是到现在我已经修改了。
但真正的问题是:当我尝试 Stub MyModelContainer 返回从 IDBSet 生成的模拟时。 Rhino mock 正在触发 InvalidOperationException:“无效调用,已使用最后一次调用,或未进行任何调用(确保您正在调用虚拟 (C#)/Overridable(VB) 方法。”
这是我的单元测试代码。
MyModelContainer dbMock = MockRepository.GenerateMock<MyModelContainer>();
IDBSet<Models.MyEntity> entityMock = MockRepository.GenerateMock<IDBSet<Models.MyEntity>>()
dbMock.Stub( x=>x.MyEntities ).Return( entityMock );
最后一条语句触发了异常。我尝试使用IDBSet<> 指定here 的假实现,但没有运气!
我使用 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这应该是正常的。
对于自动生成的Model类,发现编辑DbContext's T4模板(.tt扩展名)就可以了。感谢Alan's Blog
但我想知道为什么前面的代码不起作用。有人吗?
【问题讨论】:
标签: unit-testing asp.net-mvc-4 nunit entity-framework-5 rhino-mocks