我有一个单元测试,期望将Exception作为返回参数。
如果我通过调试器运行代码,并检查它工作的各种元素。 如果我只是运行所有测试,它就不会。
问题必须与该方法是异步的事实有关,就好像我删除了它作为exxted工作的各种Async元素。 (我猜它是时间问题)
我的单元测试是;
[TestMethod]
[ExpectedException(typeof(System.AggregateException))]
public void Service_GetDoc_ThrowsExceptionIfNull()
{
var nullRepository = new Mock<CCLDomainLogic.Repositories.DocRepository>();
IDD emptyDoc = null;
nullRepository
.Setup<Task<CCLDomainLogic.DomainModels.Doc>>
(x => x.GetDocAsync(It.IsAny<int>()))
.Returns(() => Task<CCLDomainLogic.DomainModels.Doc>.Factory.StartNew(() => emptyDoc));
DocService s = new DocService(nullRepository.Object);
var foo = s.GetDocAsync(1).Result;
}
代码(缩写为)
public async Task<Doc> GetDocAsync(int id)
{
Stopwatch timespan = Stopwatch.StartNew();
try
{
...
{
var t = await Task.Run(() => _repository.GetDocAsync(id));
...
}
timespan.Stop();
if (t == null)
{
throw new ArgumentNullException("DocService.GetDocAsync returned Null Document");
}
}
catch (Exception e)
{
throw new Exception("Error in DocService.GetDocAsync", e);
}
}
那么我如何重新设计此测试以在运行异步时捕获重复项。 作为一个额外的问题,我可以修改我的单元测试,以便检查特定的异常,而不是聚合异常吗?
答案 0 :(得分:1)
您的测试运行在断言已经运行(或不运行)之后执行的异步代码的原因。 使用调试器只会为异步代码提供更多的工作时间。 为了测试您的代码,您只需将MTest的返回类型更改为任务,并将等待添加到相关的调用中:
[TestMethod]
[ExpectedException(typeof(System.AggregateException))]
public async Task Service_GetDoc_ThrowsExceptionIfNull()
{
var nullRepository = new Mock<CCLDomainLogic.Repositories.DocRepository>();
IDD emptyDoc = null;
nullRepository
.Setup<Task<CCLDomainLogic.DomainModels.Doc>>(x => x.GetDocAsync(It.IsAny<int>()))
.Returns(() => Task<CCLDomainLogic.DomainModels.Doc>.Factory.StartNew(() => emptyDoc));
DocService s = new DocService(nullRepository.Object);
var foo = await s.GetDocAsync(1).Result;
}