lan*_*nce 5 c# rhino-mocks variable-assignment stubbing mspec
首先是我的问题,然后是一些细节:
问:在确保其值在后续分配中使用时,是否需要存根属性的值?
详细信息:
我在MSpec类中使用Rhino Mocks 3.5的AAA语法.我已经修剪了下面的代码以保持它(希望)很容易理解.
*Not Stubbing _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);
};
}
Run Code Online (Sandbox Code Playgroud)
*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!
};
}
Run Code Online (Sandbox Code Playgroud)
我测试的重要一点是,_fooResultMock Name属性中的值被赋予_fooTargetMock的属性.
那么,第一个代码块是否充分测试了这个,或者是第二个代码块(它存储了_fooResultMock Name属性的值)是必要的吗?
第二个块是否因任何原因而不受欢迎?
一些问题,将表明正确答案:
_fooResultMock 是具体类的 PartialMock 吗?如果是这样,那么如果您不存根 Name,您将获得真实类的 Name 属性的值。如果 _fooResultMock 不是 PartialMock 并且您没有存根它,您将获得 Name 类型的默认值(可能为 null)。
什么是 _fooTargetMock?此测试中的任何地方都没有指定它。那应该是 _foo 吗?
我假设结果模拟不是部分模拟;部分模拟的主要情况是将单个类的某些方法与同一类中的其他方法隔离(例如,模拟文件写入方法,以便您可以测试调用文件写入方法的计算方法)。在这种情况下,第一个代码块基本上是将 null 与 null 进行比较,无论目标模拟是否从结果模拟中获取其 Name 字段。因此,第二个代码块可以更好地测试是否发生了赋值。