如何使用 Microsoft Fakes to Shim Async Task 方法?
How to use Microsoft Fakes to Shim Async Task method?
我正在使用 Microsoft Fakes 填充一个异步方法,该方法调用另一个方法来获取已实现的 DbContext。因为单元测试中没有提供数据库连接字符串,而在异步方法中调用的方法需要它。 Shim 不仅会跳过使用连接字符串的方法,还会 returns 一个可自定义的 DbContext。
这里是aysnc方法的实现:
public async Task<AccountDataDataContext> GetAccountDataInstance(int accountId)
{
var account = await this.Accounts.FindAsync(accountId);
return AccountDataDataContext.GetInstance(account.AccountDataConnectionString);
}
但是,我不熟悉 Shim 异步方法。我所做的看起来像这样:
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 表达式完全写错了。
有什么建议吗?谢谢。
你不想return一个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
还有一些其他的 From*
方法可用于单元测试(例如 Task.FromException
)。
我正在使用 Microsoft Fakes 填充一个异步方法,该方法调用另一个方法来获取已实现的 DbContext。因为单元测试中没有提供数据库连接字符串,而在异步方法中调用的方法需要它。 Shim 不仅会跳过使用连接字符串的方法,还会 returns 一个可自定义的 DbContext。
这里是aysnc方法的实现:
public async Task<AccountDataDataContext> GetAccountDataInstance(int accountId)
{
var account = await this.Accounts.FindAsync(accountId);
return AccountDataDataContext.GetInstance(account.AccountDataConnectionString);
}
但是,我不熟悉 Shim 异步方法。我所做的看起来像这样:
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 表达式完全写错了。
有什么建议吗?谢谢。
你不想return一个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
还有一些其他的 From*
方法可用于单元测试(例如 Task.FromException
)。