【问题标题】:Rhino Mocks' AssertWasCalled on a mock's property assignment in a tested methodRhino Mocks 的 AssertWasCalled 在经过测试的方法中对 mock 的属性赋值
【发布时间】:2012-10-18 21:04:37
【问题描述】:

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

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    如果你要存根你的 bar 对象,那么你应该对属性的值进行断言

    Assert.AreEqual(7, mockBar.Name);
    

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

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

    Difference between stubs and mocks:

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

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

    【讨论】:

    • 我将其标记为答案,因为切换到模拟确实可以解决我的问题,而且我相信这是失败的原因。但是,我认为重要的是要注意,我不是在设定期望,而是断言事情已经发生。如果规则是您必须使用模拟来执行此操作,那将是一回事,但为此使用存根对方法来说效果很好,因此存在一些不一致之处。
    猜你喜欢
    • 2023-03-30
    • 2010-10-03
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多