使用 moq,您可以在相同的方法上多次调用 Setup,并具有不同的输入条件:
// 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();
但是您将如何设置其他条件案例?
编辑:我应该提到我确实意识到这是一个奇怪的设置,通常你不会在一个单元测试中测试存根的不同实现。这是一个纯粹的学术问题 - 我不会将这种类型的代码放在单元测试中......可能。
因为使用 Fakes,您基本上可以提供委托作为生成的存根方法的实现,所以您可以将任何条件逻辑放入该委托中。
在您的情况下,以下设置(如果等效于最小起订量示例):
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>)
}
};