繁体   English   中英

单元测试服务中存储库的模拟方法如何

[英]How mock methods of repository in Service for Unit test

我尝试对我的服务进行单元测试,我嘲笑了所有需要的东西,我如何模拟服务正在调用的存储库方法,以便具有价值并且代码不会破坏,

这是我的单元测试:

  public async Task Updateuser_ReturnsResponse()
    {
        // Arrange
        var request = new UpdateUserRequest()
        {
            Guid = new Guid("92296ac1-f8e1-489a-a312-6ea9d31d60f8"),
            FirstName = "TestFirst",
            LastName = "TestLast",
            PhoneWork = "9495467845",
            EmailWork = "test123@yahoo.com",
        };

        var respose = new UpdateUserResponse()
        {
            Success = true
        };

        var getGuidRequest = new GetGuidRequest()
        {
            Guid = request.Guid
        };

        var getGuidResponse = new GetGuidResponse()
        {
            Guid = request.Guid
        };

        var mockUserRepository = new Mock<IUserRepository>();
        var mockAwsProxy = new Mock<IAwsProxy>();

        mockUserRepository.Setup(s => s.UpdateUserAsync(request)).ReturnsAsync(respose);
        mockUserRepository.Setup(i => i.GetGuidAsync(getGuidRequest)).ReturnsAsync(getGuidResponse);
        var sut = new FromService.UserService(....);
        // Act
        var response = await sut.UpdateUserAsync(request);
        // Assert
        Assert.NotNull(response);
        Assert.True(response.Success);
    }

我的问题是在调用时 - var response = await sut.UpdateUserAsync(request); 它进入服务并且此 GuidResponse 为空,因此它在显示 GuidResponse Null 后中断:

    public async Task<UpdateUserResponse> UpdateUserAsync(UpdateUserRequest request)
    {
        if (request.EmailWork.HasValue() || request.Role.HasValue())
        {
            var GuidResponse = await userRepository.GetGuidAsync(new GetGuidRequest
            {
                Guid = request.Guid
            });
            // it breaks here because GuidResponse is Null.
            if (GuidResponse.Guid != null && request.EmailWork.HasValue())
            {
            .......

它失败是因为设置与执行测试时实际提供给模拟的内容不匹配。

使用It.Is<T>()匹配传递的实参

//...omitted for brevity

mockUserRepository
    .Setup(_ => _.GetGuidAsync(It.Is<GetGuidRequest>(x => x.Guid == request.Guid)))
    .ReturnsAsync(getGuidResponse);

//...omitted for brevity

假设模拟存储库是注入 SUT 的内容

参考Moq 快速入门:匹配参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM