【问题标题】:How mock methods of repository in Service for Unit test单元测试服务中如何模拟存储库方法
【发布时间】:2021-02-13 08:34:59
【问题描述】:

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

这是我的单元测试:

  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())
            {
            .......

【问题讨论】:

    标签: c# unit-testing


    【解决方案1】:

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

    使用It.Is&lt;T&gt;()匹配传入的参数参数

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

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

    参考Moq Quickstart: Matching Arguments

    【讨论】:

      猜你喜欢
      • 2018-12-17
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多