正如标题所说,我遵循模型第一的方法。所以我的Model类是自动生成的。如果我想模拟包含DBSets
实体类的DBContext
派生的MyModelContainer
。阅读一下为了进行单元测试,你需要将其更改为IDBSet
。是否有可能做到这一点,尤其是在我执行“运行自定义工具”时自动生成的类是一个问题。但截至目前我修改了它。嘲笑DBSet,EF模式第一
但真正的问题是:当我尝试存根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);
最后陈述引发的异常。我试图使用指定here假执行IDBSet<>
,但没有运气!
我使用MVC 4,犀牛嘲笑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扩展名)将做的伎俩。感谢Alan's Blog
但我想知道为什么以前的代码不起作用。任何人?