2017-10-30 8 views
3

再試行メカニズムを実装する必要があります。FakeItEasyは、例外をスローし、次の呼び出しで値を返すように偽を設定します。

RetryProviderをテストするには、最初の2回の呼び出しで例外をスローするようにクラスの偽装を行いますが、3回目の呼び出しで有効なオブジェクトを返します。通常の状況下では

私は似た何かをしたい、我々は

A.CallTo(() => this.fakeRepo.Get(1)).ReturnsNextFromSequence("a", "b", "c");を使用することができます(例外をスローせずに):

  • ファースト・コール:)(新しい例外を投げます。
  • 2番目の呼び出し:throw new Exception();
  • 第3コール:「成功」を返します。

これを行うにはどうすればよいですか?事前に

おかげ

答えて

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でこれについての詳細を参照してください。

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"); 
+1

または '().Twice()。Then.Returns(" a ")';) –

関連する問題