使用Rhino Mocks 3.6,鉴于下面的代码,我希望AssertWasCalled断言能够通过,但事实并非如此。而是有失败的断言消息:


  “ Rhino.Mocks.Exceptions.ExpectationViolationException:
  IBar.set_Model(7);预期#1,实际#0。”


尝试使用IgnoreArguments()不会更改结果,但是将IBar属性更改为方法并断言使用参数调用该方法确实有效。

我在这里想念什么?

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;

public interface IFoo { }
public interface IBar { int Model { get; set; } }
public class Bar : IBar { public int Model { get; set; } }

public class Foo : IFoo
{
    public void MyMethod(IBar bar)
    {
        bar.Model = 7;
    }
}

[TestClass]
public class TestFoo
{
    [TestMethod]
    public void MyMethod()
    {
        var foo = new Foo();

        var mockBar = MockRepository.GenerateStub<IBar>();
        foo.MyMethod(mockBar);

        mockBar.AssertWasCalled(b => b.Model = 7);
    }
}

最佳答案

如果要存入bar对象,则应该对property的值进行断言

Assert.AreEqual(7, mockBar.Name);


如果要测试期望,则应生成模拟而不是存根

var mockBar = MockRepository.GenerateMock<IBar>();
foo.MyMethod(mockBar);
mockBar.AssertWasCalled(b => b.Model = 7);


Difference between stubs and mocks


  模拟是可以设定期望值的对象,它将
  验证确实已发生预期的操作。存根是一个
  您用来传递给被测代码的对象。您可以
  设定期望值,因此它会以某些方式起作用,但是那些
  期望永远不会得到证实。存根的属性将
  自动行为就像普通属性一样,您无法设置
  对他们的期望。
  
  如果要验证被测代码的行为,您将
  使用具有适当期望的模拟,然后进行验证。如果你
  只是想传递可能需要以某种方式行事的价值,但是
  不是该测试的重点,您将使用存根。

09-27 18:37