恕我直言,当使用AssertWasCalled来验证已使用特定参数调用方法时,犀牛模拟会产生一条不明确的诊断消息。
示例:
interface ISomeInterface
{
void Write(string s);
}
[TestFixture]
public class SomeTests
{
[Test]
public void WriteShouldBeCalledWithCorrectArguments()
{
// Arrange
var mock = MockRepository.GenerateMock<ISomeInterface>();
var sut = new SomeClass(mock);
// Act
sut.DoSomething();
// Assert
mock.AssertWasCalled(x => x.Write(Arg<string>.Is.Equal("hello")));
}
}
现在,如果测试失败并显示此消息......
Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(等于hello);预期#1,实际#0。
...你不知道它是否失败,因为
一个。 “写”永远不会被引用 - 或者 - B.事实上,'Write'被调用,但参数不正确
如果B是导致失败的原因那么如果消息读出的话会更加清楚:
Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(string arg):调用方法但参数不正确:预期:hello,Actual:bye
我可以自己解决这个缺点(通过某种方式为Rhino编写自定义匹配器),还是只需要为此编写一个手动模拟器?
答案 0 :(得分:10)
我通过使用Rhino提供的“匹配”语法找到了一个简单的解决方案:
[Test]
public void WriteShouldBeCalledWithCorrectArguments()
{
// Arrange
var mock = MockRepository.GenerateMock<ISomeInterface>();
var sut = new SomeClass(mock);
// Act
sut.DoSomething();
// Assert
mock.AssertWasCalled(x => x.Write(Arg<string>.Matches(s => Equal(s, "hello"))));
}
private static bool Equal(string s1, string s2)
{
Assert.That(s1, Is.EqualTo(s2), "Unexpected argument");
return true;
}
当然,这有点笨拙,但它完成了工作。如果有更好的方法,请告诉我。
答案 1 :(得分:0)
您可以使用 GetArgumentsForCallsMadeOn
获取传递的参数并对其进行断言:
var args = mock.GetArgumentsForCallsMadeOn(x => x.Write(null), opt => opt.IgnoreArguments())[0];
Assert.AreEqual("Hello", args[0]):