Как протестировать ответ API JSON?
Я пытаюсь настроить модульные тесты для моего веб-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.\"}"
Ответы
Ответ 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(status, 0);
Ответ 2
По этот блог, добавьте ссылку на сборку в AssemblyInfo.cs вашего веб-проекта:
[assembly: InternalsVisibleTo("MyNamespace.Tests")]
Затем вы можете протестировать, как и следовало ожидать, с обычным объектом, за исключением того, что вы не можете заменить "var" для "динамического" типа:
namespace MyNamespace.Tests
// some code
private string TheJsonMessage()
{
dynamic data = _json.Data;
return data.message;
}
Мне понадобилось четыре часа, чтобы найти этот маленький камень.