在我的 MVVM 模型中,我调用了一个存储库方法:
public async Task LoadDistricts()
{
var districtsJson = await itemRepository.GetDistricts();
}
存储库使用 Polly 策略重试某些异常。
public async Task<List<DistrictJson>> GetDistricts()
{
var districtsJson = await ExecutePolicyServiceCall(async () =>
{
return await policy.ExecuteAsync(async (cancelToken) =>
{
return await service.GetDistricts(cancelToken);
},
CancellationToken.None);
});
return districtsJson;
}
存储库实现了一个我创建的接口方法,叫做
ExecutePolicyServiceCall
public async Task<TResult> ExecutePolicyServiceCall<TResult>(Func<Task<TResult>> executePolicyServiceCall)
{
try
{
return await executePolicyServiceCall?.Invoke();
}
...
}
我的测试设置是:
var mockService = new Mock<ICPService>();
mockService.Setup(api => api.GetDistricts(It.IsAny<CancellationToken>()))
.Throws<TaskCanceledException>();
var itemRepository = new ItemsRepository(mockService.Object, Service.GetPolicyRegistry());
var teacherRepository = new TeacherRepository(mockService.Object, Service.GetPolicyRegistry());
var signInModel = new SignInModel(geolocations, itemRepository, teacherRepository);
await signInModel.LoadDistricts("Add District");
然而,当我验证时:
mockService.Verify(api => api.GetDistricts(It.IsAny<CancellationToken>()), Times.Exactly(3), "TaskCanceledException failed to retry 3 times.");
单元测试错误清楚地表明
GetDistricts(...)
没有收到来自PollyCancellationToken
的
policy.ExecuteAsync(Func<CancellationToken, Task<TResult>>,...)
有什么办法让它收到正确的
CancellationToken
? GetDistricts
参数定义为CancellationToken token = default
.