Указание содержимого HttpRequestMessage для модульного теста Web API - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть метод контроллера веб-API, который я хочу провести модульное тестирование. Требуется HttpRequestMessage, но я не могу понять, как установить контент, который я хочу передать. Можно ли создать / смоделировать HttpRequestMessage, чтобы я мог дать ему string, который я хочу быть результатом await request.Content.ReadAsStringAsync()?

Это мой метод управления:

[HttpPost]
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
    var data = await request.Content.ReadAsStringAsync();
    //do something with data
}

Я легко могу создать HttpRequestMessage с его конструктором без параметров, но я не могу понять, как установить для содержимого значащее значение. Я бы хотел, чтобы мой тест работал по следующим направлениям:

[TestMethod]
public async Task PostMethodWorks()
{
    var controller = new MyController();

    var data = "this will be JSON";
    var httpRequestMessage = new HttpRequestMessage();
    //set the content somehow so that httpRequestMessage.Content.ReadAsStringAsync returns data

    var response = await controller.Post(httpRequestMessage);

    //assert something about the response here
}

Можно ли установить значение содержимого для некоторого JSON, или мне нужно будет изменить метод, чтобы он принимал другой параметр?

(Для большего контекста я хочу, чтобы метод принимал HttpRequestMessage, потому что я работаю над устаревшей кодовой базой, в которой есть множество методов контроллера, которые принимают HttpRequestMessage.)

1 Ответ

0 голосов
/ 13 сентября 2018

Можно ли установить значение содержимого в некоторый JSON

Да

Вы можете использовать любой из множества HttpContent производных классов. Поскольку в этом случае вы хотите отправлять контент в формате JSON, вы должны использовать StringContent class

Например

[TestMethod]
public async Task PostMethodWorks() {
    //Arrange
    var controller = new MyController();

    var data = "this will be JSON";
    var httpRequestMessage = new HttpRequestMessage();

    //set the content somehow so that httpRequestMessage.Content.ReadAsStringAsync returns data 
    httpRequestMessage.Content = new StringContent(data, Encoding.UTF8, "application/json");


    //Act
    var response = await controller.Post(httpRequestMessage);

    //Assert
    //assert something about the response here
}

Однако это похоже на проблему XY , поскольку в идеале действия Web API не принимают HttpRequestMessage в качестве аргумента.

или мне нужно будет изменить метод, чтобы он принимал другой параметр?

Существуют подшивки моделей, которые можно использовать для строго типизированных параметров действий, которые будут анализировать входящие данные и заполнять модели, а затем переходить к действиям.

...