moq方法调用未被验证

问题描述 投票:0回答:1

我有一个测试方法在sso.verify上失败了,注意到CheckUsername方法有两个async方法中的 await调用吗? 但正因为如此,sso verify从来没有返回,因此没有被验证。但是代码被调用了。正确的测试方法是什么?

       public void Setup()
    {
        nav = new Mock<INavService>();
        sso = new Mock<ISSOApiService>();
        _vm_Successs = new ForgotPasswordViewModel(nav.Object, sso.Object);
        sso.Setup(x => x.SendEmailCodeRequestAsync(It.IsAny<PasswordTokenRequest>())).ReturnsAsync(new StandardResponse() { ErrorCode = null }).Verifiable();
        nav.Setup(x => x.NavigateTo<ForgotPasswordEnterCodeModel, string>(It.IsAny<string>())).Verifiable(); 
    }


  [Test]
    public void CheckUserName_Success()
    {
        _vm_Successs.UserName = "Timmy";
        var response = _vm_Successs.CheckUsername();
        sso.Verify(e => e.SendEmailCodeRequest(It.IsAny<PasswordTokenRequest>()), Times.Once);
        nav.Verify(mock => mock.NavigateTo<ForgotPasswordEnterCodeModel, string>(It.IsAny<string>()), Times.Once);
    }

这是checkusername方法

public async Task CheckUsername()
{
            PasswordTokenRequest r = new PasswordTokenRequest();
                await SSOAPIService.SendEmailCodeRequestAsync(r);
            await NavService.NavigateTo<ForgotPasswordEnterCodeModel, string>(UserName);
        }

enter image description here

c# asynchronous async-await moq
1个回答
1
投票

你应该等待测试方法,因此你需要使你的测试'async Task'类型。

还需要设置SendEmailCodeRequestAsync和ReturnsAsync。

    [Test]
    public async Task ShouldDeleteAzureBlobById()
    {
        sso.Setup(x => x.SendEmailCodeRequestAsync(It.IsAny<PasswordTokenRequest>()))
        .ReturnsAsync(new StandardResponse() { ErrorCode = null })
        .Verifiable();

        _vm_Successs.UserName = "Timmy";
        var response = await _vm_Successs.CheckUsername();
        sso.Verify(e => e.SendEmailCodeRequestAsync(It.IsAny<PasswordTokenRequest>()), Times.Once);
        nav.Verify(mock => mock.NavigateTo<ForgotPasswordEnterCodeModel, string>(It.IsAny<string>()), Times.Once);
    }
© www.soinside.com 2019 - 2024. All rights reserved.