5

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

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

详细信息:
我在 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 的属性。

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

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

4

1 回答 1

1

一些问题,这将表明正确的答案:

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

  • 什么是_fooTargetMock?在此测试中的任何地方都没有指定它。那应该是 _foo 吗?

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

于 2011-05-19T20:26:46.380 回答