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

时间:2011-05-19 13:00:52

标签: c# rhino-mocks variable-assignment mspec stubbing

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

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

详细信息:
我在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);
    };
}

* Stubbing _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属性的值)是否必要?

第二个阻止不受欢迎是出于何种原因?

1 个答案:

答案 0 :(得分:1)

有些问题会表明正确答案:

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

  • 什么是_fooTargetMock?在此测试中未指定任何位置。那应该是_foo吗?

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