2016-04-14 15 views
2

私は実装されたDbContextを取得する別のメソッドを呼び出す非同期メソッドをShimにMicrosoft Fakesを使用しています。非同期メソッド内で呼び出されているメソッドでは、ユニットテストでデータベース接続文字列が指定されていないためです。 Shimは、接続文字列を使用するメソッドをスキップするだけでなく、カスタマイズ可能なDbContextを返します。Microsoft Fakes to Shim Asyncタスクメソッドを使用する方法?

public async Task<AccountDataDataContext> GetAccountDataInstance(int accountId) 
{ 
    var account = await this.Accounts.FindAsync(accountId); 

    return AccountDataDataContext.GetInstance(account.AccountDataConnectionString); 
} 

は、しかし、私はシム非同期メソッドに精通していないよ:

はここaysncメソッドの実装です。私はこのようになりました:

ConfigurationEntities.Fakes.ShimConfigurationDataContext.AllInstances.GetAccountDataInstanceInt32NullableOfInt32 = (x, y, z) => new Task<AccountDataEntities.AccountDataDataContext>(() => 
{ 
    return new SampleContext();// This is the fake context I created for replacing the AccountDataDataContext. 
}); 

、次のようにSampleContextはAccountDataDataContextを実施している。

以下
public class SampleContext: AccountDataDataContext 
{ 
    public SampleContext() 
    { 
     this.Samples = new TestDbSet<Sample>(); 

     var data = new AccountDataRepository(); 

     foreach (var item in data.GetFakeSamples()) 
     { 
      this.Samples.Add(item); 
     } 
    } 
} 

は、テストケースのためのコードスニペットです:結果

[TestMethod] 
public async Task SampleTest() 
{ 
    using (ShimsContext.Create()) 
    { 
     //Arrange 
     SamplesController controller = ArrangeHelper(1);// This invokes the Shim code pasted in the second block and returns SamplesController object in this test class 

     var accountId = 1; 
     var serviceId = 2; 

     //Act 
     var response = await controller.GetSamples(accountId, serviceId);// The async method is invoked in the GetSamples(int32, int32) method. 

     var result = response.ToList(); 

     //Assert 
     Assert.AreEqual(1, result.Count); 
     Assert.AreEqual("body 2", result[0].Body); 
    } 
} 

、私のテストケースは永遠に動いています。私はShim lamdasの表現を完全に間違って書くかもしれないと思う。

提案がありますか?ありがとうございました。

答えて

1

new Taskを返信したくないです。実際、you should never, ever use the Task constructor。ブログで説明しているように、有効なユースケースはまったくありません。

代わりに、Task.FromResultを使用する:

ConfigurationEntities.Fakes.ShimConfigurationDataContext.AllInstances.GetAccountDataInstanceInt32NullableOfInt32 = 
    (x, y, z) => Task.FromResult(new SampleContext()); 

Taskはまた、ユニットテスト(例えば、Task.FromException)のために有用であるいくつかの他のFrom*方法を有しています。

+0

タスクコンストラクターについて知っておきたいことは、それに関するいくつかのスペックを確認するだけです。明日私のワークステーションに着いたらTask.FromResult()を試してみましょう。ありがとうございました。 –

関連する問題