2016-11-10 13 views
4

私は次の行にメソッドを持っている:私はawait Task.Delay(waitTime).ConfigureAwait(false);モッキングTask.Delay

ユニットテスト、代わりに我々は特定の秒数を待つことを試みていることを確認したときに、実際に数秒を待っ避けるために良い戦略があります。例えば

は、私は架空ITaskWaiterインターフェースのモックオブジェクトを注入し、この(不自然)の例のように私の方法に追加のパラメータを注入する方法がある。

// Arrange 
var mockWait = new Mock<ITaskWaiter>(MockBehavior.Strict); 
mockWait.Setup(w => w.Delay(It.Is<TimeSpan>(t => t.TotalSeconds == 2))); 

// Act 
myObject.MyMethod(mockWait.Object); 

// Assert 
mockWait.Verify(); 

答えて

6

あなたが」を定義することができこのような遅延」インターフェース:

public interface IAsyncDelayer 
{ 
    Task Delay(TimeSpan timeSpan); 
} 

そして本番コードの次の実装を提供することができます:

public class AsyncDelayer : IAsyncDelayer 
{ 
    public Task Delay(TimeSpan timeSpan) 
    { 
     return Task.Delay(timeSpan); 
    } 
} 

public class ClassUnderTest 
{ 
    private readonly IAsyncDelayer asyncDelayer; 

    public ClassUnderTest(IAsyncDelayer asyncDelayer) 
    { 
     this.asyncDelayer = asyncDelayer; 
    } 

    public async Task<int> MethodUnderTest() 
    { 
     await asyncDelayer.Delay(TimeSpan.FromSeconds(2)); 

     return 5; 
    } 
} 

これはDependency Injectionの基本的なアプリケーションです:

今、あなたのクラスには、次のようになります。基本的には、別のクラスに非同期に待っているロジックを抽出し、polymorphismを有効にするためのインターフェイスを作成しました。

製造においては、このようなあなたのオブジェクトを構成します:

[TestMethod] 
public async Task TestMethod1() 
{ 
    var mockWait = new Mock<IAsyncDelayer>(); 

    mockWait.Setup(m => m.Delay(It.IsAny<TimeSpan>())).Returns(Task.FromResult(0)); 

    var sut = new ClassUnderTest(mockWait.Object); 

    var result = await sut.MethodUnderTest(); 

    Assert.AreEqual(5, result); 
} 

var myClass = new ClassUnderTest(new AsyncDelayer()); 

今、あなたのテストでは、あなたがこのようにすぐに戻ります偽の遅延を作成することができます

関連する問題