【发布时间】:2017-07-23 10:22:18
【问题描述】:
我有一个 ASP.NET MVC 应用程序,带有一个具有异步方法的控制器,返回 Task<PartialViewResult> 对象并用 async 关键字标记。
此方法仅以异步模式从数据库中获取数据。
public async Task<PartialViewResult> SomeMethod()
{
using (var unitOfWork = _factory.Create())
{
var result = await unitOfWork.SomeRepository.GetAsync();
return PartialView(result);
};
}
在测试期间,流只是在这个地方冻结(在运行时这段代码运行良好):
var models = await unitOfWork.SomeRepository.GetAsync();
这是我对这个方法的测试:
public void GetExchange_GetView_OkModelIsViewModel()
{
//fake Repository returns fake Data from DB
var mockSomeRepository = new Mock<ISomeRepository>();
mockSomeRepository.Setup(x => x.GetAsync(...).Returns(new Task<List<SomeType>>(() => new List<SomeType>()));
//fake UoW returns fake Repository
var mockUnitOfWork = new Mock<IUnitOfWork>();
mockUnitOfWork.Setup(x => x.SomeRepository).Returns(mockSomeRepository.Object);
//fake factory create fake UoW
var fakeUnitOfWorkFactory = new Mock<UnitOfWorkFactory>();
fakeUnitOfWorkFactory.Setup(x => x.Create()).Returns(mockUnitOfWork.Object);
//Our controller
var controller = new SomeController(fakeUnitOfWorkFactory);
//Our async method
var result = controller.SomeMethod();
result.Wait();
//---Assert--
}
问题:为什么我的方法中的流在测试执行期间会冻结???
更新
如果我替换此测试将开始工作
var result = await unitOfWork.SomeRepository.GetAsync();
到
var models = unitOfWork.SomeRepository.GetAsync();
models.Start();
models.Wait();
var result = models.Result;
但我不太明白为什么会这样。谁能解释一下?
【问题讨论】:
-
最初的例子是将阻塞调用(
.Result,.Wait())与异步调用混合,这会导致死锁,从而导致挂起。使整个测试和被测代码一直异步。
标签: c# asp.net-mvc unit-testing nunit moq