【问题标题】:AssertWasCalled on dynamic in Rhino Mocks在 Rhino Mocks 中使用动态 AssertWasCalled
【发布时间】:2013-10-05 21:38:53
【问题描述】:

有没有办法在 RhinoMocks 中对动态执行 AssertWasCalled,如下所示:

    var testObject = MockRepository.GenerateStub<dynamic>();
    testObject.AssertWasCalled(x=>x.MyMethod(Arg<string>.Matches(y=>y == "TestString"));

【问题讨论】:

  • 我认为这是不可能的,因为 GenerateStub 其中 T 是一个类。除非您有一个派生自 Dynamic 类型的类,否则这可能是可能的。我自己没试过。
  • 有没有其他方法可以测试某个方法是否被动态调用了?

标签: unit-testing rhino-mocks


【解决方案1】:

正如我在 cmets 中提到的,我不认为大多数基于代理的 Mock 对象框架 (RhinoMock/Moq) 支持动态验证。 您可以尝试基于分析器的框架,例如 TypeMock 等,但它们不是免费的。

所以我认为唯一的选择是回到我们写手写存根/模拟的旧学校。

创建另一个间接层。许多地方的一种技术被描述为提取和覆盖。 因此,您只需创建一个手写模拟来验证此行为。

一个。创建一个简单/愚蠢的受保护虚拟成员来包装您的动态调用

被测系统(SUT):

  public class Sut {
    private dynamic _d;

    public Sut(dynamic d) {
        _d = d;
    }

    public void M() {
        MyMethod();
    }

    protected virtual void MyMethod() {
        _d.MyMethod();
    }
 }

b.在您的单元测试中,通过从 Sut 继承来创建 Sut 的可测试版本。 重要提示:它应该只包含被覆盖的方法,而不能包含其他任何东西(除了确保调用被覆盖的方法的 bool)

public class TestableSutWithDynamic : Sut {
    public bool WasCalled = false;

    protected override void MyMethod() {
        WasCalled = true;
    }
}

c。然后简单地针对可测试的 Sut 断言

    [Test]
    public void VerifyMyMethodIsCalled() {
        var sut = new TestableSutWithDynamic();

        sut.M();

        Assert.True(sut.WasCalled);
    }        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多