0

是否可以使用 StructureMap.AutoMocking 中提供的自动模拟框架来测试 CUT 中的内部虚拟方法?我已将 InternalsVisibleTo 添加到相应的 AssemblyInfo.cs 文件中。这是我正在尝试做的事情:

public ClassA {
    public void Method1() { Method2(); }
    internal virtual void Method2() { /* do work */ }
}

[Test]
public void TestClassA() {

    // Arrange
    var mockedClass = new RhinoAutoMocker<ClassA>();
    mockedClass.PartialMockTheClassUnderTest();
    mockedClass.ClassUnderTest.Expect(x => x.Method2());

    // Act
    mockedClass.ClassUnderTest.Method1();

    // Assert
    mockedClass.ClassUnderTest.VerifyAllExpectations();
}

我已经知道将内部方法更改为公共工程,但我不认为这是执行此测试的可接受方式。也许我错过了关于 RhinoMocks 和 StructureMap 交互方式的一些基本知识,但我认为基于我编写的其他单元测试,这种类型的东西应该可以工作。

编辑我想这将有助于提供我在尝试此操作时收到的错误消息:

System.InvalidOperationException : Invalid call, the last call has been used or no call       
has been made (make sure that you are calling a virtual (C#) / Overridable (VB) 
method).
at Rhino.Mocks.LastCall.GetOptions()
at Rhino.Mocks.RhinoMocksExtensions.Expect(T mock, Func`2 action)
at Rhino.Mocks.RhinoMocksExtensions.Expect(T mock, Action`1 action)
at ClassATest.TestClassA() in ClassA.cs      
4

1 回答 1

0

编辑 我在下面的陈述中是错误的。我终于回到了这一点,并protected在我的所有单元测试中使用了这个关键字,这些单元测试是internal virtual我被测类中的测试方法。这确实适用于结构映射,并且是我收到我收到的错误的唯一原因。

在对此进行一些研究之后,似乎 Rhino.Mocks 的某些元素无法通过 StructureMap.Automocker 访问。当我重新编写单元测试以仅使用 Rhino.Mocks 框架时,我能够向测试运行器公开“内部虚拟”方法。这不是一个理想的情况,我希望在较新版本的 StructureMap 中看到对此的支持,但如果在添加对“内部虚拟”方法的支持之前还有其他更重要的事情,那可能还有很长的路要走。

我根据以下帖子重新进行了单元测试:

http://ayende.com/Wiki/Rhino+Mocks+-+Internal+Methods.ashx

如何使用 Rhino.Mocks 模拟受保护的虚拟成员?

于 2013-01-31T14:57:54.747 回答