有没有办法在RhinoMocks中的动态上执行AssertWasCalled,如下所示:
var testObject = MockRepository.GenerateStub<dynamic>();
testObject.AssertWasCalled(x=>x.MyMethod(Arg<string>.Matches(y=>y == "TestString"));
答案 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);
}