Rhino Mocks:如何为断言设置桩值?

5

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

问:在确保属性的值在随后的赋值中使用时,我是否需要桩化(Stub)属性的值?

细节:
我正在使用Rhino Mocks 3.5的AAA语法在MSpec类中。 我已经削减了下面的代码,以使其易于理解。

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

第二个代码块有没有任何不良影响?


测试还不完整,以我个人的看法。你的Foo类从未实际使用这些依赖项。 - Alexander Groß
我已经修改了代码,使得依赖项在构造函数中被注入。当执行“Whatever”方法时,将使用该依赖项。 - lance
当您在调试foo时,所有依赖项都是Rhino Castle Proxis吗? - benwasd
1个回答

1

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接