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? Или я лаяю неправильное дерево/принципиально непонимаю, как это должно работать? Спасибо...
Ответы
Ответ 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
}