所以,我在测试以下情况时遇到了麻烦:
ICommand LoginCommand;
public LoginViewModel()
{
LoginCommand = new Command(async () => await LoginCommandAction());
}
private async Task LoginCommandAction()
{
var response = await _tokenService.GetToken(_user, _password, token);
}
这就是我的ViewModel。现在,在我的ViewModel测试中,我希望能够在我的LoginCommand上调用execute
并且等待 GetToken完成,以便我可以断言其结果。
我尝试过调用execute()
,但测试在通话结束前完成。
我也尝试过:
public async Task TestMethod() => await Task.Run(() => Vm.LoginCommand.Execute(null));
但这也不起作用。我相信我必须在行动上返回一些内容,但我不确定是什么。
答案 0 :(得分: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}"
答案 1 :(得分:0)
您不能对ICommand.Execute方法使用await关键字。如果要测试登录操作,首先将LoginCommandAction的方法访问修饰符更改为public,并从TestMethod调用LoginCommandAction方法。