获取 Delete HttpResponseMessage 的一个属性

3
我想测试下面一个API请求的输出。
async Task DeleteNonExistantFoo()
{
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri("Http://localhost:43240/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        using (HttpResponseMessage response = await client.DeleteAsync("api/foos/1"))
        {
            var responseContent = await response.Content.ReadAsStringAsync();
            //Assert.AreEqual(?????, "A Foo with ID of 1 does not exist.");
        }
    }
}

我想从以下响应中获取exceptionMessage,当我发送DELETE请求到API时,会得到这样的响应。在Visual Studio调试时,它不允许我查看响应内容对象,给出了以下错误信息:

"responseContent 由于该指令指针不可用,可能已被优化掉,因此无法获取局部变量或参数的值。"

我需要将其转换为JSON对象才能读取吗?

{
    "message": "An error has occurred.",
    "exceptionMessage": "A Foo with ID of 1 does not exist.",
    "exceptionType": "System.Exception",
    "stackTrace": "
} 

不确定这是否是您的“确切”代码,但请注意每个请求都新建一个HttpClient,这实际上是性能和稳定性问题。您应该使用共享静态HttpClient(但要注意由此引起的DNS问题)。 - maccettura
在单元测试类的ClassInitalize方法中初始化HTTP客户端,并让所有测试使用该HTTP客户端,这种做法可行吗? - Luke
1个回答

3

您可以尝试使用Newtonsoft.JsonJsonConvert.DeserializeObject方法将响应JSON转换为对象并使用它。

创建一个名为ApiResponeMoedl的类。

public class ApiResponeMoedl
{
    public string message { get; set; }
    public string exceptionMessage { get; set; }
    public string exceptionType { get; set; }
    public string stackTrace { get; set; }
}

然后使用 JsonConvert.DeserializeObject<ApiResponeMoedl> 将您的 JSON 数据反序列化为一个 ApiResponeMoedl 对象,然后使用对象的 exceptionMessage 属性,您将获得您所需的信息。

async Task DeleteNonExistantRedirect()
{
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri("Http://localhost:43240/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        using (HttpResponseMessage response = await client.DeleteAsync("api/foos/1"))
        {
            var responseContent = await response.Content.ReadAsStringAsync();
            var respOjb = JsonConvert.DeserializeObject<ApiResponeMoedl>(responseContent);
            //respOjb.exceptionMessage
        }
    }
}

谢谢回复,当我运行该代码并尝试调试时,我收到了以下错误信息:测试方法Website.Test.Api.FooApiControllerTest.DeleteMethodFoo引发异常:System.NullReferenceException:对象引用未设置为对象的实例。 - Luke
当您运行并出现错误时,获取的json数据是什么?它是否与您的问题样本相同? - D-Shih
responseContent = ""和responseObj = null,当我在Postman中测试API时,仍然得到相同的HTTP响应。 - Luke
1
我一再尝试,最终在数据库中的不同项上尝试时成功了。如果我遇到其他错误,我会通知你的。谢谢! - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接