代码之家  ›  专栏  ›  技术社区  ›  bilpor

发布Moq'ing HttpResponseMessage

  •  10
  • bilpor  · 技术社区  · 7 年前

    我有以下方法:

    public async Task<SecurityRoleDeleteResult> DeleteSecurityRoleByRoleId(int securityRoleId)
    {
        string url = $"{_housingDataSecurityConfiguration.HousingDataSecurityWebApiUrl}SecurityRoles/Delete";
    
        HttpResponseMessage message = _apiClientService.Post(url, securityRoleId);
    
        if (message.StatusCode == HttpStatusCode.InternalServerError)
        {
            return SecurityRoleDeleteResult.ErrorOccurred;
        }
    
        int intResult = 0;
        var apiResult = await message.Content.ReadAsStringAsync();
        if (int.TryParse(apiResult, out intResult))
        {
            return (SecurityRoleDeleteResult)intResult;
        }
        else
        {
            return SecurityRoleDeleteResult.ErrorOccurred;
        }
    }
    

    我现在正试图为它编写一个单元测试,到目前为止:

    [Test]
    public async Task DeleteSecurityRoleByRoleId()
    {
        _mockApiClientService.Setup(a => a.Post(It.IsAny<string>(), It.IsAny<int>()))
            .Returns(new HttpResponseMessage {StatusCode = HttpStatusCode.OK});
    
        SecurityRoleDeleteResult result = await _securityRoleService.DeleteSecurityRoleByRoleId(It.IsAny<int>());
    
        Assert.AreEqual(SecurityRoleDeleteResult.Success, result);
    }
    

    这里的问题是,在 _securityRoleService.DeleteSecurityRoleByRoleId 方法在我试图设置的点 var apiResult 消息内容是空的,因为在这个例子中我只是在嘲笑所以崩溃。

    我怎样才能模拟出这一点,以便我的测试能够正常进行?

    1 回复  |  直到 7 年前
        1
  •  23
  •   Nkosi    7 年前

    我解决了我的问题。与其删除我的问题,我想我应该把我的更改发布到测试中。基本上我没有嘲笑内容。

    HttpContent content = new StringContent("4");
    
    _mockApiClientService.Setup(a => a.Post(It.IsAny<string>(), It.IsAny<int>()))
        .Returns(new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = content });
    

    因此,根据您可能希望返回的内容类型,您可能需要更改内容的类型。

    推荐文章