3

使用 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);
    }
}
4

1 回答 1

6

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

Assert.AreEqual(7, mockBar.Name);

如果你想测试期望,你应该生成模拟而不是存根

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

存根和模拟之间的区别

模拟是我们可以设置期望的对象,它将验证预期的动作确实发生了。存根是您用来传递给被测代码的对象。您可以对其设置期望,因此它会以某些方式运行,但这些期望永远不会被验证。存根的属性会自动表现得像普通属性一样,您不能对它们设置期望。

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

于 2012-10-18T21:14:53.747 回答