编程语言
首页 > 编程语言> > c# – 用于测试调用异步方法的ICommand的模式

c# – 用于测试调用异步方法的ICommand的模式

作者:互联网

我只关注单元测试(NUnit)ICommand的最佳实践,特别是MVVMCross中的MvxCommand实施

查看模型

public ICommand GetAuthorisationCommand
{
    get { return new MvxCommand(
            async () => await GetAuthorisationToken(),
            () => !string.IsNullOrWhiteSpace(UserName) && !string.IsNullOrWhiteSpace(Password)); }
}

private async Task GetAuthorisationToken()
{
    // ...Do something async
}

单元测试

[Test]
public async Task DoLogonCommandTest()
{
    //Arrange
    ViewModel vm = new ViewModel(clubCache, authorisationCache, authorisationService);

    //Act
    await Task.Run(() => vm.GetAuthorisationToken.Execute(null));

    //Assert
    Assert.Greater(MockDispatcher.Requests.Count, 0);
}

现在我遇到的问题是测试在没有等待异步操作的情况下逐渐消失,从ICommand调用异步方法感觉有些麻烦.

在单元测试这些ICommands和异步方法时是否有最佳实践?

解决方法:

您可以使用MvxAsyncCommand(请参阅:implementation)而不是MvxCommand,并将已发布的GetAuthorisationCommand类型从ICommand更改为IMvxAsyncCommand(但该接口不能通过nuget获得)然后您可以调用

await vm.GetAuthorisationToken.ExecuteAsync();

标签:c,unit-testing,async-await,mvvmcross,icommand
来源: https://codeday.me/bug/20190717/1488125.html