3

使用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 fakes 来完成这个?代码看起来像这样:

// 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();

但是您将如何设置其他条件案例?

编辑:我应该提到我确实意识到这是一个奇怪的设置,通常你不会在一个单元测试中测试存根的不同实现。这是一个纯粹的学术问题 - 我不会将这种类型的代码放在单元测试中......可能。

4

1 回答 1

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>)
        }
};
于 2013-01-31T12:14:47.187 回答