使用moq,您可以使用不同的输入条件多次使用相同的方法调用安装程序:
// Arrange
Mock<IObject> stub = new Mock<IObject>();
stub.Setup(method => method.Foo(It.IsAny<int>())
.Returns<int>(value => value);
stub.Setup(method => method.Foo(It.Is<int>(t => t == 100)
.Returns<int>(value => value * 1.10);
var sut = new TestedObject(stub.Object);
// Act
var actual = sut.Bar();
...
......等等。在这种情况下,Foo方法取一个整数,并根据传递的值确定方法的实现。
有没有办法用Visual Studio假货来实现这一目标?代码看起来像这样:
// Arrange
var stub = new StubIObject
{
Foo = (value) => value, // This covers the default case (It.IsAny<T>)
};
var sut = new TestedObject(stubIObject);
// Act
var actual = sut.Bar();
但是你会如何设置其他条件情况呢?
编辑: 我应该提到我确实意识到这是一个奇怪的设置,通常你不会在一个单元测试中测试存根的不同实现。这是一个纯粹的学术问题 - 我不会把这种类型的代码放在单元测试中......可能。
答案 0 :(得分:3)
因为使用Fakes,您基本上可以提供委托作为生成的存根方法的实现,您可以将任何条件逻辑放在该委托中。
在您的情况下,如果与moq示例等效,则以下设置:
var stub = new StubIObject
{
Foo = (value) =>
{
if (value == 100)
// This covers the case (It.Is<int>(t => t == 100))
return value * 1.10;
return value; // This covers the default case (It.IsAny<T>)
}
};