【问题标题】:IHttpActionResult Anonymous Object - Validate ResultsIHttpActionResult 匿名对象 - 验证结果
【发布时间】:2014-03-18 17:40:23
【问题描述】:

我正在尝试为我们的一些 webapi 调用创建测试,但我无法访问结果。在我查看的所有示例中,它们都使用 OkNegotiatedContentResult。问题在于,在我们的 web api 调用中,我们经常将数据包装在匿名对象中,以便我们可以组合数据集。我可能忽略了一些明显的东西,但我似乎无法找出检查结果信息以验证它的正确方法。

WebApi 片段

var orderInfo = new
{
   Customer = customerInfo,
   Order = orderInfo
}

return Ok(orderInfo);

API 测试片段

    [TestMethod]
    public void TestGetOrderInfo()
    {
        var controller = new OrderController(_repo);
        IHttpActionResult results = controller.GetOrderInfo(46);

        Assert.IsNotNull(results);


    }

当涉及匿名类型时,如何使用 OkNegotiatedContentResult 检查结果?

【问题讨论】:

  • 你有没有得到这个工作?我在尝试对通过 IHttpActionResult 返回 JSON 的控制器进行单元测试时遇到完全相同的问题,并且由于必须在控制器返回之前添加根节点而看到匿名类型。我无法对此进行测试,因为我无法正确使用OkNegotiatedContentResult。我尝试了下面的动态方法但没有成功。

标签: c# asp.net-web-api anonymous-types


【解决方案1】:

匿名类型出现问题的原因是它们是内部类型而不是公共类型,因此您的测试不能使用它们。

如果您将 InternalsVisibleTo 属性添加到您的 webapi 项目,您将能够通过动态引用结果及其内容,例如:

[TestMethod]
public void TestGetOrderInfo()
{
    var controller = new OrderController(_repo);
    dynamic results = controller.GetOrderInfo(46);
    dynamic content = results.Content;

    ...

}

【讨论】:

  • 我在匿名类型和 IHttpActionResult 上遇到了同样的问题。我必须在我的 JSON 返回中添加一个根节点,所以从 Web API 2.0 我正在做return Json(new { User = person }); 以在其中获取一个名为“用户”的根节点。这现在返回一个匿名类型。我尝试按照您的示例进行操作,但在 dynamic content = results.Content 上失败了,因为“对象”不包含“内容”的定义
  • 这有帮助,但后来我得到一个编译器错误“缺少编译器所需的成员'microsoft.csharp.runtimebinder.binder.convert'”,这导致我到stackoverflow.com/a/50050820/283895,现在它已修复。
  • 我只想说动态是丑陋的AF。如果您真的想要这个,请创建一个返回您输入的 ContentResult 的类。
【解决方案2】:

匿名对象在创建它们的程序集内部。如果您在单独的程序集 (DLL) 中进行单元测试,您需要明确说明您希望使用 InternalsVisibleTo 属性与该程序集共享内部值。

【讨论】:

    【解决方案3】:

    Patrick 找到了您收到错误“'object' does not contain a definition for 'Content'”的原因。 SUT 生成的匿名类型是内部的。与测试项目共享内部结构,您应该能够通过在项目的 AssemblyInfo.cs 中执行以下操作来检查匿名类型:正在测试

    [assembly: InternalsVisibleTo("Tests.Unit")] 
    

    http://patrickdesjardins.com/blog/how-to-unit-test-a-method-that-return-an-anonymous-type的文章中找到这个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      相关资源
      最近更新 更多