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

时间:2012-10-18 21:04:38

标签: 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);
    }
}

1 个答案:

答案 0 :(得分:6)

如果要对条形对象进行存根,则应对属性值

进行断言
Assert.AreEqual(7, mockBar.Name);

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

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

Difference between stubs and mocks

  

模拟是一个我们可以设定期望的对象,以及将要设置的期望   验证确实发生了预期的操作。存根是一个   您用于传递给测试代码的对象。您可以   设定对它的期望,所以它会以某种方式行动,但那些   期望永远不会得到验证。存根的属性会   自动表现得像普通属性,你无法设置   对他们的期望。

     

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