FakeItEasy配置假以在下次调用时抛出异常并返回值

时间:2017-10-30 14:03:31

标签: c# .net unit-testing mocking fakeiteasy

我们必须实施重试机制。

要测试RetryProvider,我想要假一个类在前两个调用上抛出异常,但在第三个调用时返回一个有效的对象。

在正常情况下(不抛出异常),我们可以使用A.CallTo(() => this.fakeRepo.Get(1)).ReturnsNextFromSequence("a", "b", "c");

我想要类似的东西:

  • First Call:抛出新的Exception();
  • 第二次调用:抛出新的异常();
  • 第三次电话会议:返回"成功";

如何配置我的假冒呢?

提前致谢

2 个答案:

答案 0 :(得分:3)

var fakeRepo = A.Fake<IFakeRepo>();

A.CallTo(() => fakeRepo.Get(1))
     .Throws<NullReferenceException>()
     .Once()
     .Then
     .Throws<NullReferenceException>()
     .Once()
     .Then
     .Returns('a');

Specifying different behaviors for successive calls了解详情。

答案 1 :(得分:3)

这应该有效:

A.CallTo(() => this.fakeRepo.Get(1))
    .Throws<Exception>().Twice()
    .Then
    .Returns("a");

另一种方式就像序列一样:

var funcs = new Queue<Func<string>>(new Func<string>[]
{
    () => throw new Exception(),
    () => throw new Exception(),
    () => "a",
});
A.CallTo(() => this.fakeRepo.Get(1)).ReturnsLazily(() => funcs.Dequeue().Invoke()).NumberOfTimes(queue.Count);

可以有扩展方法:

public static IThenConfiguration<IReturnValueConfiguration<T>> ReturnsNextLazilyFromSequence<T>(
    this IReturnValueConfiguration<T> configuration, params Func<T>[] valueProducers)
{
    if (configuration == null) throw new ArgumentNullException(nameof(configuration));
    if (valueProducers == null) throw new ArgumentNullException(nameof(valueProducers));

    var queue = new Queue<Func<T>>(valueProducers);
    return configuration.ReturnsLazily(x => queue.Dequeue().Invoke()).NumberOfTimes(queue.Count);
}

这样称呼:

A.CallTo(() => this.fakeRepo.Get(1)).ReturnsNextLazilyFromSequence(
    () => throw new Exception(),
    () => throw new Exception(),
    () => "a");