NSubstitute多个返回序列

Ale*_*tin 6 nsubstitute

我想替换对象来返回不同对象的序列.例如:

var http = Substitute.For<IHttp>();
http.GetResponse(Arg.Any<string>()).Returns(resourceString, resourceString2);
http.GetResponse(Arg.Any<string>()).Returns(x => { throw new Exception(); });
Run Code Online (Sandbox Code Playgroud)

将返回resourceString然后是resourceString2然后返回异常.

或类似的东西:

var http = Substitute.For<IHttp>();
http.GetResponse(Arg.Any<string>()).Returns(resourceString, x => { throw new Exception(); }, resourceString2);
Run Code Online (Sandbox Code Playgroud)

将返回resourceString然后异常,然后是resourceString2.

我怎样才能做到这一点?

Dav*_*pak 12

NSubstitute中的多返回语法仅支持值.要抛出异常,您需要将函数传递给Returns自己并实现所需的逻辑(例如Returns(x => NextValue())).

Haacked的博客上有一个使用队列的Moq序列的相关示例.您可以使用NSubstitute执行类似的操作(仅限示例代码,使用风险自负:) :):

public interface IFoo { int Bar(); }

[Test]
public void Example() {
    var results = new Results<int>(1)
                    .Then(2)
                    .Then(3)
                    .Then(() => { throw new Exception("oops"); });
    var sub = Substitute.For<IFoo>();
    sub.Bar().Returns(x => results.Next());

    Assert.AreEqual(1, sub.Bar());
    Assert.AreEqual(2, sub.Bar());
    Assert.AreEqual(3, sub.Bar());
    Assert.Throws<Exception>(() => sub.Bar());
}

public class Results<T> {
    private readonly Queue<Func<T>> values = new Queue<Func<T>>();
    public Results(T result) { values.Enqueue(() => result); }
    public Results<T> Then(T value) { return Then(() => value); }
    public Results<T> Then(Func<T> value) {
        values.Enqueue(value);
        return this;
    }
    public T Next() { return values.Dequeue()(); }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


小智 9

现在,这是NSubstitute中受支持的功能,具有非常友好的界面.

这会是......

var http = Substitute.For<IHttp>();
http.GetResponse(Arg.Any<string>()).Returns(x => resourceString, x => resourceString2, x => { throw new Exception(); });
Run Code Online (Sandbox Code Playgroud)

文档可以在这里找到