使用Xamarin.Forms(MVVM)测试命令

时间:2018-05-28 11:18:51

标签: xamarin.forms nunit

所以,我在测试以下情况时遇到了麻烦:

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));

但这也不起作用。我相信我必须在行动上返回一些内容,但我不确定是什么。

2 个答案:

答案 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方法。