私は実装された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の表現を完全に間違って書くかもしれないと思う。
提案がありますか?ありがとうございました。
タスクコンストラクターについて知っておきたいことは、それに関するいくつかのスペックを確認するだけです。明日私のワークステーションに着いたらTask.FromResult()を試してみましょう。ありがとうございました。 –