在VS 2013上,我无法让此异步测试失败。
我有xUnit 1.8.0.1539(从nuget安装),xUnit Test Runner VS扩展(0.99.5)。所有最新的,AFAIK。
我碰巧在单元测试中也有Moq,AutoFixture和FluentAssertions参考,但我认为这并不重要(但我承认它是这样的。)
我已在我的解决方案的其他方面完成了异步单元测试,并且它们可以工作。
我在这些新创建的测试中遗漏了一些东西,而且我无法告诉我错过了什么或做错了什么。
注意 SUT代码并不完整。在我编写代码以使测试变为绿色之前,我只是想先获得红灯。
这是测试代码:
using System.Threading.Tasks;
using FluentAssertions;
using Xunit;
namespace MobileApp.Proxy.Test
{
public class WhenRetrievingPriceDataFromClient
{
[Fact]
public async Task GroupReportIsReturnedWithSomeData()
{
// arrange
var sut = new Client();
// act
var actual = await sut.GetReportGroupAsync();
// assert
// Xunit test
Assert.Null(actual);
Assert.NotNull(actual);
// FluentAssertions
actual.Should().BeNull();
actual.Should().NotBeNull();
}
}
}
这是SUT代码:
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;
using MobileApp.Proxy.Properties;
namespace MobileApp.Proxy
{
public class Client
{
public async Task<ReportGroup> GetReportGroupAsync()
{
return await Task.FromResult(new ReportGroup());
}
}
}
显然,这个测试应该失败! Null和NotNull的Asserts都不会成功,所以我的结论是测试在完成从SUT获得响应之前就已退出。
我错过了什么?
或者,有没有更好的方法我应该在编写SUT代码之前启动异步测试以确保它失败?
答案 0 :(得分:24)
You need xUnit 1.9 async
单元测试才能正常工作。
答案 1 :(得分:5)
xUnit v1.9或更高版本支持异步测试。如果您遇到早期版本,则需要执行以下操作:
[Fact]
public void GroupReportIsReturnedWithSomeData()
{
GroupReportIsReturnedWithSomeDataAsync().Wait();
}
private async Task GroupReportIsReturnedWithSomeDataAsync()
{
// arrange
var sut = new Client();
// act
var actual = await sut.GetReportGroupAsync();
// assert
// Xunit test
Assert.Null(actual);
Assert.NotNull(actual);
// FluentAssertions
actual.Should().BeNull();
actual.Should().NotBeNull();
}
基本上,测试方法会阻塞,直到异步测试方法完成,无论是由于成功完成还是故障(例如,断言失败)。在出现故障的情况下,异常将通过Wait()
传播到主测试线程。
您可能希望将超时时间传递给Wait()
,这样如果在一段时间后没有完成测试,您的测试将会失败。如上所述,如果异步方法永远不会完成,测试可能会无限期地阻塞。