犀牛模拟:断言中使用的存根值

本文关键字:存根 模拟 断言 犀牛 | 更新日期: 2023-09-27 17:56:51

首先是我的问题,然后是一些细节:

问:在确保在后续赋值中使用属性值时,是否需要存根属性的值?

详:
我在 MSpec 类中使用 Rhino Mocks 3.5 的 AAA 语法。 我已经修剪了下面的代码,以保持它(希望)易于摸索。

*不存根_fooResultMock的属性价值:*

[Subject("Foo")]
public class when_foo {
    Establish context = () => {
        _fooDependencyMock.Stub(x => x.GetResult()).Return(_fooResultMock);
        _foo = new Foo(_fooDependencyMock);
    };
    Because action = () => {
        _foo.Whatever();
    };
    It should_set_the_name_field = () => {
        _fooTargetMock.AssertWasCalled(x => x.Name = _fooResultMock.Name);
    };
}

*存根_fooResultMock的财产价值:*

[Subject("Foo")]
public class when_foo {
    Establish context = () => {
        _fooDependencyMock.Stub(x => x.GetResult()).Return(_fooResultMock);
        _fooResultMock.Stub(x => x.Name).Return(_theName); // _theName!
        _foo = new Foo(_fooDependencyMock);
    };
    Because action = () => {
        _foo.Whatever();
    };
    It should_set_the_name_field = () => {
        _fooTargetMock.AssertWasCalled(x => x.Name = _theName); // _theName!
    };
}

对我的测试来说,重要的是在_fooResultMock的Name属性中找到的值被分配给_fooTargetMock的属性。

那么,第一个代码块

是否充分测试了这一点,或者第二个代码块(存根_fooResultMock Name属性的值)是必要的?

第二个块是否出于任何原因不可取

犀牛模拟:断言中使用的存根值

一些问题,将指示正确答案:

  • _fooResultMock是具体类的部分模拟吗?如果是这样,那么如果不存根 Name,你将获得真实类的 Name 属性的值。如果_fooResultMock不是 PartialMock 并且您没有存根它,您将获得 Name 类型的默认值(可能为 null)。

  • 什么是_fooTargetMock?此测试中未在任何地方指定它。这应该是_foo吗?

我假设结果模拟不是部分模拟;部分模拟的主要情况是将单个类的某些方法与同一类中的其他方法隔离开来(例如,模拟文件写入方法,因此您可以测试调用文件写入方法的计算方法)。在这种情况下,第一个代码块基本上是将 null 与 null 进行比较,无论目标模拟是否从结果模拟中获取其 Name 字段。因此,第二个代码块可以更好地测试是否发生了赋值。