1

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

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

1 回答 1

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 的可测试版本。重要提示:它应该只包含被覆盖的方法,但不能包含其他任何东西(除了确保调用被覆盖的方法的布尔值)

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);
    }        
于 2013-10-06T10:23:02.223 回答