0

所以,我在测试以下场景时遇到了麻烦:

ICommand LoginCommand;

public LoginViewModel()
{
    LoginCommand = new Command(async () => await LoginCommandAction());
}

private async Task LoginCommandAction()
{
    var response = await _tokenService.GetToken(_user, _password, token);
}

那是我的视图模型。现在,在我的 ViewModel 测试中,我希望能够execute在我的 LoginCommand 上调用 an 并等待GetToken 完成,以便我可以断言它的结果。

我试过只打电话,execute()但测试在电话之前完成。

我也试过:

public async Task TestMethod() =>  await Task.Run(() => Vm.LoginCommand.Execute(null));

但这也没有用。我相信我必须在我的Action上返回一些东西,但我不确定是什么。

4

2 回答 2

1

测试类似的东西:

public ICommand LoginCommand
{
    get
    {
        return new Command(async () => 
        {
            await LoginCommandAction();
        });
    }
}

async Task LoginCommandAction()
{
    await _tokenService.GetToken(_user, _password, token).ContinueWith((arg) => 
    {
        if(arg.IsCompleted)
        {
            ...
        }
    });
}

确保您的视图的 BindingContext 是正确的,并且您的绑定在 .xaml 中具有以下形式:

Command = "{Binding LoginCommand}"
于 2018-05-28T12:10:09.523 回答
0

您不能对 ICommand.Execute 方法使用 await 关键字。如果您想测试您的登录操作,首先将 LoginCommandAction 的方法访问修饰符更改为 public 并从您的 TestMethod 中调用 LoginCommandAction 方法。

于 2018-05-28T18:00:45.993 回答