【发布时间】:2010-09-09 16:21:51
【问题描述】:
我有以下测试来验证我的存储库是否正在调用它的相应会话(我已经对其进行了重写以突出实际问题):
[Test]
public void Why_Does_This_Fail()
{
var objectUnderTest = new SomeGenericsProblem();
var fakeSession = MockRepository.GenerateMock<ISession>();
fakeSession.Expect(s => s.Query<SomeClass>());
objectUnderTest.NotWorking<SomeClass>();
fakeSession.AssertWasCalled(t => t.Query<SomeClass>());
}
但是当我运行测试时,我得到了这个:
System.InvalidOperationException: 通话无效,上次通话已 已使用或未拨打电话(拨打 确保您正在调用虚拟 (C#)/可覆盖(VB)方法)。(C#)/可覆盖(VB)方法)。
有什么想法我在这里做错了吗?我正在模拟的会话是一个接口,因此它必须是虚拟的/可覆盖的。
我感觉这与我的 Query 方法是通用的这一事实有关,但我不知道任何其他方式来表达我要测试的内容。
另外,如果我删除设置期望的部分(即这行代码:)
fakeSession.Expect(s => s.Query<SomeClass>());
我得到一个不同的例外,这同样让我感到困惑:
System.InvalidOperationException:否 期望被设置为 已验证,确保方法调用 在动作中是一个虚拟(C#)/ 可重写(VB.Net)方法调用可重写(VB.Net)方法调用
【问题讨论】:
-
我在您的测试中没有发现任何问题。您是否尝试删除 UnitOfWork 并查看它是否有帮助?我想知道您的 Repository.Query 或 uow.Commit-methods 中是否有某些东西导致测试失败。我将您的测试方法复制粘贴到我自己的项目中,并让 ReSharper 创建 UnitOfWork、Repository 和 ISession。测试通过了。我正在使用 Rhino Mocs 3.5 版。
-
@Mikael 我必须在那里有工作单元,因为如果不是,那么当我创建存储库时它会抛出一个无效的操作异常(按设计)。我删除了提交,我得到了同样的东西。我的 repository.Query 方法实际上只是调用 Session.Query 就可以了。
-
我只是使用相同的设计但使用我自己的 POCO 从头开始重写了测试,它仍然给我同样的错误。
标签: unit-testing mocking rhino-mocks