AssertWas对Rhino Mocks中的动态进行了调查

时间:2013-10-05 21:38:53

标签: unit-testing rhino-mocks

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

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

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,我不认为大多数基于代理的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();
    }
 }

湾在单元测试中,通过继承Sut来创建可测试版本的Sut。 重要说明:它应该只包含重写的方法,但没有其他内容(除了bool以确保调用重写的方法)

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

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

℃。然后简单地断言可测试的Sut

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

        sut.M();

        Assert.True(sut.WasCalled);
    }