有没有办法在 RhinoMocks 中对动态进行 AssertWasCalled,如下所示:
var testObject = MockRepository.GenerateStub<dynamic>();
testObject.AssertWasCalled(x=>x.MyMethod(Arg<string>.Matches(y=>y == "TestString"));
有没有办法在 RhinoMocks 中对动态进行 AssertWasCalled,如下所示:
var testObject = MockRepository.GenerateStub<dynamic>();
testObject.AssertWasCalled(x=>x.MyMethod(Arg<string>.Matches(y=>y == "TestString"));
正如我在评论中提到的,我认为大多数基于代理的 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);
}