Rhino Mocks的AssertWas在一个测试方法中对mock的属性赋值进行了调用

Sco*_*ler 3 c# unit-testing rhino-mocks

使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 6

如果您正在对条形对象进行存根,那么您应该对属性值进行断言

Assert.AreEqual(7, mockBar.Name);
Run Code Online (Sandbox Code Playgroud)

如果你想测试期望,你应该生成mock而不是stub

var mockBar = MockRepository.GenerateMock<IBar>();
foo.MyMethod(mockBar);
mockBar.AssertWasCalled(b => b.Model = 7);
Run Code Online (Sandbox Code Playgroud)

存根和模拟之间的区别:

模拟是一个我们可以设置期望的对象,它将验证预期的操作确实已经发生.存根是您用于传递给测试代码的对象.您可以设置它的期望,因此它会以某种方式起作用,但这些期望永远不会得到验证.存根的属性将自动表现为普通属性,您无法设置它们的期望.

如果要验证测试代码的行为,您将使用具有适当期望的模拟,并验证.如果您只想传递可能需要以某种方式执行的值,但不是此测试的焦点,则将使用存根.