【发布时间】:2019-06-13 22:18:07
【问题描述】:
这是我第一次为异步方法编写单元测试。我正在使用 xUnit。我搜索了 SO,但没有得到有希望的结果。我发现但对我不起作用的最好方法是从THIS 示例中实现IAsyncLifetime。对于如何解决此问题的任何提示,我将不胜感激。
目前我所拥有的。在经过测试的虚拟机中,我有一个命令:
public ICommand TestResultsCommand { get; private set; }
并且该命令在VM构造函数中初始化如下:
TestResultsCommand = new DelegateCommand(OnTestResultExecuteAsync);
命令调用方法:
private async void OnTestResultExecuteAsync(object obj)
{
TokenSource = new CancellationTokenSource();
CancellationToken = TokenSource.Token;
await TestHistoricalResultsAsync();
}
TestHistoricalResultsAsync 方法的签名如下:
private async Task TestHistoricalResultsAsync()
现在让我们进入单元测试项目。目前在测试类我有一个方法:
[Fact]//testing async void
public void OnTestResultExecuteAsync_ShouldCreateCancellationTokenSource_True()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = tokenSource.Token;
_viewModel.TestResultsCommand.Execute(null);
Assert.Equal(cancellationToken.CanBeCanceled, _viewModel.CancellationToken.CanBeCanceled);
Assert.Equal(cancellationToken.IsCancellationRequested, _viewModel.CancellationToken.IsCancellationRequested);
}
测试让我例外:
消息:System.NullReferenceException:对象引用未设置为 一个对象的实例。
提前感谢您的时间和建议。
【问题讨论】:
-
async void应该只用于事件处理程序。参考Async/Await - Best Practices in Asynchronous Programming. -
还应该重构代码以使其更加可靠,以便您可以正确测试和维护代码。如果没有更好地了解被测类,就没有更多可以建议的了,因为您似乎正在尝试测试私有成员。
-
@Nkosi 但
async void不应该也用于DelegateCommand? -
@Nkosi 好吧,在我的测试方法中,我刚刚执行了命令 async
await Task.Run(() => _viewModel.TestResultsCommand.Execute(null));并且它起作用了。基于此的解决方案:forums.xamarin.com/discussion/97504/testing-async-commands
标签: c# async-await xunit delegatecommand