【问题标题】:How to test web API JSON response?如何测试 Web API JSON 响应?
【发布时间】:2014-02-04 10:38:02
【问题描述】:

我正在尝试为我的 Web API 设置单元测试。我从网上找到的点点滴滴中拼凑了一些测试代码。我已经发送了测试请求并收到了响应,但我一直在测试响应。

这就是我到目前为止所得到的。这是使用 xunit 测试包,但我认为这对我想要实现的目标并不重要。

(为代码混乱道歉)

[Fact]
public void CreateOrderTest()
{
    string baseAddress = "http://dummyname/";

    // Server
    HttpConfiguration config = new HttpConfiguration();
    config.Routes.MapHttpRoute("Default", "api/{controller}/{action}/{id}",
        new { id = RouteParameter.Optional });
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

    HttpServer server = new HttpServer(config);

    // Client
    HttpMessageInvoker messageInvoker = new HttpMessageInvoker(new InMemoryHttpContentSerializationHandler(server));

    // Order to be created
    MotorInspectionAPI.Controllers.AccountController.AuthenticateRequest requestOrder = new MotorInspectionAPI.Controllers.AccountController.AuthenticateRequest() { 
        Username = "Test",
        Password = "password"
    };

    HttpRequestMessage request = new HttpRequestMessage();
    request.Content = new ObjectContent<MotorInspectionAPI.Controllers.AccountController.AuthenticateRequest>(requestOrder, new JsonMediaTypeFormatter());
    request.RequestUri = new Uri(baseAddress + "api/Account/Authenticate");
    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    request.Method = HttpMethod.Get;

    CancellationTokenSource cts = new CancellationTokenSource();

    using (HttpResponseMessage response = messageInvoker.SendAsync(request, cts.Token).Result)
    {
        Assert.NotNull(response.Content);
        Assert.NotNull(response.Content.Headers.ContentType);

        // How do I test that I received the correct response?

    }

我希望我可以将响应检查为字符串,类似于

response == "{\"Status\":0,\"SessionKey\":"1234",\"UserType\":0,\"Message\":\"Successfully authenticated.\"}"

【问题讨论】:

标签: c# unit-testing asp.net-web-api xunit xunit.net


【解决方案1】:

以下是您如何以字符串形式获取响应:

var responseString = response.Content.ReadAsStringAsync().Result;

但是 json 格式可能会有所不同,我敢打赌你不想测试它 - 所以我建议使用 Newtonsoft.Json 或一些类似的库,将字符串解析为 json 对象并测试 json 对象属性。就这样了

using Newtonsoft.Json.Linq;   

dynamic jsonObject = JObject.Parse(responseString);
int status = (int)jsonObject.Status;
Assert.Equal(0, status);

【讨论】:

  • 出于某种原因认为它会比这更棘手。谢谢,这就是我一直在寻找的。我意识到 JSON 的不同数据结构,但只是试图一次解决一个问题 :) 编辑:感谢您的 Newtonsoft JSON 示例。
  • 我得到 jsonObject.Status 为空
【解决方案2】:

根据this blog,在您的 Web 项目的 AssemblyInfo.cs 中添加程序集引用:

[assembly: InternalsVisibleTo("MyNamespace.Tests")]

然后,您可以按预期使用普通对象进行测试,但不能用“var”替换“动态”类型:

namespace MyNamespace.Tests
// some code
       private string TheJsonMessage()
       {
           dynamic data = _json.Data;
           return data.message;
       }

我花了四个小时才找到那个小宝石。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2023-02-07
    • 2017-10-08
    • 1970-01-01
    • 2014-10-01
    • 2014-06-02
    相关资源
    最近更新 更多