是否可以使用StructureMap.AutoMocking测试内部虚拟方法

时间:2012-12-05 23:41:12

标签: c# unit-testing structuremap rhino-mocks

是否可以使用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      

1 个答案:

答案 0 :(得分:0)

修改 我在下面的陈述中错了。我终于回过头来,在我测试的类中测试protected方法的所有单元测试中使用关键字internal virtual DOES 在结构图中工作,这是我收到错误的唯一原因。

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

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

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

How to mock protected virtual members with Rhino.Mocks?