【发布时间】:2016-03-22 07:50:06
【问题描述】:
我尝试使用包含异步方法的 NUnit 测试一个类。我不知道如何以正确的方式做到这一点。
我有一个看起来像这样的课程:
public class EditorViewModel:INotifyPropertyChanged
{
public void SetIdentifier(string identifier)
{
CalcContentAsync();
}
private async void CalcContentAsync()
{
await SetContentAsync();
DoSomething();
}
private async Task SetContentAsync()
{
Content = await Task.Run<object>(() => CalculateContent());
RaisePropertyChanged("Content");
}
public object Content { get; private set; }
...
}
如何在 NUnit 中编写一个测试来检查 Content-Property 是否设置为正确的值?我想做这样的事情:
[Test]
public void Content_WhenModifierIsXXX_ReturnsSomeViewModel()
{
var viewModel = new EditorViewModel();
viewModel.SetIdentifier("XXX");
Assert.That(viewModel.Content, Is.InstanceOf<ISomeContentViewModel>());
}
但这不起作用。因为在断言之前异步代码还没有执行。
【问题讨论】:
-
SetIdentifier 上没有 async 只是一个错字吗?
-
@Domysee 我认为是因为它无法以其他方式编译。
-
Avoid async void。说真的 - 不要这样做。您无法对其进行测试,任何调用代码都无法等待完成。
-
我不太确定异步和等待。我的意图是在计算内容的同时执行
DoSomething()方法。这不是正确的做法吗?
标签: c# unit-testing async-await nunit