IHttpActionResult匿名对象 - 验证结果

时间:2014-03-18 17:40:23

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

我正在尝试为我们的一些webapi调用创建测试,但我在访问结果时遇到了困难。在我看过的所有示例中,他们都在使用OkNegotiatedContentResult。问题是在我们的web api调用中,我们经常将数据包装在匿名对象中,因此我们可以组合数据集。我可能忽略了一些显而易见的事情,但我似乎无法找出检查结果信息以验证它的正确方法。

WebApi代码段

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

return Ok(orderInfo);

Api Test Snippet

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

        Assert.IsNotNull(results);


    }

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

3 个答案:

答案 0 :(得分:10)

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

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

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

    ...

}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

帕特里克找到了为什么你会收到错误“'对象'不包含'内容'的定义”。 SUT生成的匿名类型是内部的。与测试项目共享内部,您应该能够通过在项目的AssemblyInfo.cs中执行类似的操作来检查匿名类型:正在测试

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

在文章http://patrickdesjardins.com/blog/how-to-unit-test-a-method-that-return-an-anonymous-type

中找到了这个