Подтвердить что ты не робот

Unit Testing, что HttpResponseMessage содержит требуемый ответ

Я пишу контроллер веб-API, и сейчас у меня есть следующий код:

public class PicklistsController : ApiController
{
    private readonly IPicklistRepository _repository;

    public PicklistsController(IPicklistRepository repository)
    {
        _repository = repository;
    }

    public HttpResponseMessage GetPicklistValues(string entityName, string fieldName)
    {
        if(_repository.Exists(entityName, fieldName))
            return Request.CreateResponse(HttpStatusCode.Accepted, _repository.Get(entityName, fieldName));

        return new HttpResponseMessage(HttpStatusCode.NotFound);
    }

}

Я пытаюсь протестировать этот метод, и все, что я действительно хочу сделать, это проверить, что HttpResponseMessage содержит значения в POCO PicklistItem, когда репозиторий находит эту комбинацию значений. Будучи новичком в этой структуре, я не очень хорошо разбираюсь в внутренних функциях HttpResponseMessage, и то, что я нашел на этом сайте и через общий googling, говорит мне использовать различные методы ReadAsync на его Контенте, но я действительно не хочу для использования async, если я могу избежать этого. Я просто хочу проверить, что вещь, которую я набила в объект, который я возвращаю, находится в объекте, когда я возвращаю его. Вот что я до сих пор использовал с помощью unit test (используя JustMock для настройки репозитория, Target - CUT):

public void Returns_Picklist_Item_JSON_When_Results_Exist()
{
    Repository.Arrange(repo => repo.Exists(EntityName, FieldName)).Returns(true);

    const int value = 2;
    const string label = "asdf";
    var mynewPicklistItem = new PicklistItem() { Label = label, Value = value };
    Repository.Arrange(repo => repo.Get(EntityName, FieldName)).Returns(Enumerable.Repeat<PicklistItem>(mynewPicklistItem, 1));

    var response = Target.GetPicklistValues(EntityName, FieldName);
    //Assert.IsTrue(I don't know what to do here -- suggestions appreciated);
}

Любые идеи для Assert? Или я лаяю неправильное дерево/принципиально непонимаю, как это должно работать? Спасибо...

4b9b3361

Ответ 1

Если Content - это объект, попробуйте сделать его как ObjectContent - свойство Value должно содержать ваш объект.

Если это a StreamContent, хотя тогда я не знаю другого способа, чем сделать ReadAsAsync. Тем не менее вы можете заблокировать результат выполнения задачи, чтобы увидеть ответ.

Вот пример:

var response = Target.GetPicklistValues(EntityName, FieldName);
ObjectContent objContent = response.Content as ObjectContent;
PicklistItem picklistItem = objContent.Value as PicklistItem;

Ответ 2

Я использую Web API 2.1, и есть функция с именем TryGetContentValue:

[Test]
public void TheTestMethod()
{
    // arrange

    var ctrl = new MyController();

    ctrl.Request = Substitute.For<HttpRequestMessage>();  // using nSubstitute
    ctrl.Configuration = Substitute.For<HttpConfiguration>();

    // act

    HttpResponseMessage result = ctrl.Get();

    MyResponse typedresult;
    result.TryGetContentValue(out typedresult);     // <= this one

    // assert
}