对 HttpResponseMessage 包含所需响应进行单元测试
本文关键字:单元测试 响应 HttpResponseMessage 包含所 | 更新日期: 2023-09-27 17:56:50
我正在编写一个Web 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 的内部工作原理,我在这个网站上发现的和通过一般的谷歌搜索告诉我在其内容上使用各种 ReadAsync 方法,但我真的不想使用异步,如果我能避免它。 我真的只是想验证我塞进要返回的对象中的东西在我返回的对象中时是否在对象中。 以下是我到目前为止的单元测试(使用 JustMock 设置存储库,目标是 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);
}
对断言有什么想法吗? 还是我吠错了树/从根本上误解了这应该如何工作? 谢谢。。。
我正在使用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
}
如果
Content
是一个对象,则尝试将其转换为ObjectContent
- Value
属性应包含您的对象。
如果这是一个StreamContent
,那么我不知道除了做ReadAsAsync
之外还有其他方法。您仍然可以阻止任务的结果以查看响应。
下面是一个示例:
var response = Target.GetPicklistValues(EntityName, FieldName);
ObjectContent objContent = response.Content as ObjectContent;
PicklistItem picklistItem = objContent.Value as PicklistItem;