【问题标题】:Unit Testing that HttpResponseMessage Contains the Desired Response对 HttpResponseMessage 包含所需响应的单元测试
【发布时间】:2013-01-15 01:21:48
【问题描述】:

我正在编写一个 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 设置存储库,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);
}

对断言有什么想法吗?还是我在吠叫错误的树/从根本上误解了这应该如何工作?谢谢...

【问题讨论】:

  • HttpResponseMessage 上有一个Content 字段,您不能检查它是否包含您期望的字符串吗?你控制了进来的对象,你可以测试出来的是同一个对象。
  • 嗯,这就是我一直在抨击的属性——Intellisense 给了我一个 Headers 属性,然后是一堆方法,其中大多数返回布尔值或涉及异步。如果有什么我可以将其转换为以获得我想要的东西,那将是完美的(它上面的 ToString() 只返回类型信息)。
  • 你的意思是当你做response.时,智能说Content不是属性之一吗?或者您只是不确定如何查看HttpContent
  • 我可以访问 response.Content,但我不知道如何将其转换为有用的内容或使用其属性/方法来获取我想要的内容。
  • @Erik - 如果Content 是一个对象,那么尝试将其转换为ObjectContent - Value 属性应该包含您的对象。如果它是StreamContent,那么我不知道除了执行 ReadAsAsync 之外的其他方法。您仍然可以阻止任务的Result 以查看响应。

标签: c# unit-testing asp.net-web-api


【解决方案1】:

如果Content 是一个对象,则尝试将其转换为ObjectContent - Value 属性应该包含您的对象。

如果是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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2010-12-25
      • 2019-10-17
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多