RhinoMocks / AssertWasCalled:验证参数长度?

时间:2010-12-06 16:28:17

标签: c# design-patterns arguments rhino-mocks

我的MSpec测试将断言使用(至少)给定长度的参数调用给定方法。

这个语法在断言失败,尽管参数(在运行时)的长度为534:

_foo.AssertWasCalled(x => x.Write(Arg.Text.Like(".{512,}")));
  

ExpectationViolationException:IFoo.Write(如“。{512,}”);预期#1,实际#0。

我对Like()的模式做错了什么?

2 个答案:

答案 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