我的MSpec测试将断言使用(至少)给定长度的参数调用给定方法。
这个语法在断言失败,尽管参数(在运行时)的长度为534:
_foo.AssertWasCalled(x => x.Write(Arg.Text.Like(".{512,}")));
ExpectationViolationException:IFoo.Write(如“。{512,}”);预期#1,实际#0。
我对Like()的模式做错了什么?
答案 0 :(得分:0)
为什么不直接测试争论的长度
Assert.IsTrue(Arg.Text.Length >= 512);
一般情况下,当你得到“预期#1,实际#0”时,在犀牛嘲笑中。这意味着Equals存在问题,例如没有在对象上实现equals。
答案 1 :(得分:0)
也许它与您使用的RhinoMocks版本有关?我正在使用RhinoMocks版本3.5.0.1337和Like正确检测长度。
public interface IFoo
{
void Write(string value);
}
public class Bar
{
private readonly IFoo _foo;
public Bar(IFoo foo)
{
_foo = foo;
}
public void Save(string value)
{
_foo.Write(value);
}
}
测试
private Bar _bar;
private IFoo _foo;
[SetUp]
public void BeforeEachTest()
{
var mocker = new RhinoAutoMocker<Bar>();
_bar = mocker.ClassUnderTest;
_foo = mocker.Get<IFoo>();
}
[Test]
public void Given_input_length_equal_to_that_required_by_Like()
{
CallSave("".PadLeft(512));
}
[Test]
public void Given_input_longer_than_required_by_Like()
{
CallSave("".PadLeft(513));
}
[Test]
[ExpectedException(typeof(ExpectationViolationException))]
public void Given_input_shorter_than_required_by_Like()
{
CallSave("".PadLeft(511));
}
private void CallSave(string value)
{
_bar.Save(value);
_foo.AssertWasCalled(x => x.Write(Arg.Text.Like(".{512,}")));
}
如果我顺便使用.Expect()而不是.AssertWasCalled(),测试也会通过。
private void CallSave(string value)
{
_foo.Expect(x => x.Write(Arg.Text.Like(".{512,}")));
_bar.Save(value);
_foo.VerifyAllExpectations();
}
如果这些测试通过并且您确定参数的长度,则通过将测试更改为
来验证是否正在调用Write。_foo.AssertWasCalled(x => x.Write(Arg<specify type here>.Is.Anything))
编辑:
测试也通过RhinoMocks版本3.6.0.0