这个答案已经过时了——NSubstitute 现在直接支持这个。有关更多信息,请参阅@dangerdex对此问题的回答。
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()(); }
}
希望这可以帮助。