【问题标题】:How do you assert a generic method was called with Rhino Mocks?你如何断言一个泛型方法是用 Rhino Mocks 调用的?
【发布时间】: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


【解决方案1】:

所以我知道出了什么问题。

ISession 来自 NHibernate,我可能应该提到。

这至关重要的原因是因为

session.Query<T> 

(这是我要模拟的),是一种扩展方法

Rhino Mocks 显然具有模拟扩展方法的能力,因此它给了我奇怪的错误。

所以希望我能节省其他人在试图弄清楚为什么我的测试不会通过时所经历的时间和痛苦。

我读到的唯一解决方案是实际更改扩展方法的设计(我不能这样做,因为它是 NHibernate 的一部分),或者使用不同的模拟框架,例如 TypeMock。

【讨论】:

    【解决方案2】:
    [Test]
    public void Query_WhenCalled_CallsSessionQuery()
    {
            // arrange
            var session = MockRepository.GenerateStub<ISession>();
    
            var r = new Repository(session);
    
            // act
            r.Query<SomeClass>();
    
            // assert
            session.AssertWasCalled(s => s.Query<SomeClass>());
    }
    

    【讨论】:

    • 感谢杰伊的想法,但我重写了问题以突出显示发生了什么,并完全删除了 using 子句。问题仍然存在。
    • @Joseph 以上工作。请注意,我使用GenerateStub&lt;&gt; 而不是GenerateMock&lt;&gt;,并且没有明确设置期望,因为这是不必要的。
    • 再次感谢。我弄清楚了问题所在。 Query 函数实际上是一种扩展方法,这就是为什么我得到错误而你没有。您可能会构建自己的 ISession 接口,而我的接口来自 NHibernate。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多