首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测试web API JSON响应?

如何测试web API JSON响应?
EN

Stack Overflow用户
提问于 2014-02-04 18:38:03
回答 2查看 24.9K关注 0票数 12

我正在尝试为我的web API设置单元测试。我从网上找到的零碎代码中拼凑了一些测试代码。我已经完成了发送测试请求并接收响应的工作,但是我被困在测试响应上。

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

(对代码的混杂表示歉意)

代码语言:javascript
运行
复制
[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?

    }

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

代码语言:javascript
运行
复制
response == "{\"Status\":0,\"SessionKey\":"1234",\"UserType\":0,\"Message\":\"Successfully authenticated.\"}"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-04 18:50:32

下面是如何获取字符串形式的响应:

代码语言:javascript
运行
复制
var responseString = response.Content.ReadAsStringAsync().Result;

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

代码语言:javascript
运行
复制
using Newtonsoft.Json.Linq;   

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

Stack Overflow用户

发布于 2014-10-03 05:28:07

按照this blog,在web项目的AssemblyInfo.cs中添加一个程序集引用:

代码语言:javascript
运行
复制
[assembly: InternalsVisibleTo("MyNamespace.Tests")]

然后,您可以像预期的那样使用普通对象进行测试,只是不能用"var“替换"dynamic”类型:

代码语言:javascript
运行
复制
namespace MyNamespace.Tests
// some code
       private string TheJsonMessage()
       {
           dynamic data = _json.Data;
           return data.message;
       }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21550057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档