web-dev-qa-db-ja.com

Web API JSON応答をテストする方法は?

WebAPIの単体テストをセットアップしようとしています。私はウェブ上で見つけた断片からいくつかのテストコードを一緒にハッキングしました。テストリクエストを送信して応答を受信することはできますが、応答のテストに固執しています。

これが私がこれまでに得たものです。これは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.\"}"
12
Ally

応答を文字列として取得する方法は次のとおりです。

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);
16
Ondrej Svejdar

このブログ に従って、WebプロジェクトのAssemblyInfo.csにアセンブリ参照を追加します。

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

次に、「動的」タイプの代わりに「var」を使用できないことを除いて、通常のオブジェクトで期待どおりにテストできます。

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

その小さな宝石を見つけるのに4時間かかりました。

1
Chaim Eliyah