迭代另一个范围内的匿名变量,而不是创建它的位置

时间:2008-11-20 14:07:05

标签: c# .net asp.net-mvc unit-testing

我正在为mvc Web应用程序编写单元测试,该应用程序检查返回的匿名变量列表(在jsonresult中)是否正确。因此我需要遍历该列表,但我似乎无法找到一种方法。

所以我有两种方法

1)返回json结果。在那个json结果中有一个叫做data的属性。该属性是object类型,但在内部它是一个匿名变量列表

2)该方法调用方法1并检查返回的jsonresult是否正常。

如果我运行测试并打破调试器,我可以将鼠标悬停在结果上并查看其中的项目。我只是没有找到在代码中这样做的方法。(只使用foreach是不可能的,因为在我需要它的时候我不在创建匿名方法的方法中)

3 个答案:

答案 0 :(得分:1)

我认为你的意思是“匿名类型”,你说的是“匿名变量” - 但你仍然可以使用foreach遍历列表,只是将迭代变量声明为类型object:< / p>

foreach (object o in myList)
{
    // Not sure what you're actually trying to do in here...
}

如果需要检查内容,可以使用匿名类型以有用的方式覆盖ToString这一事实。您的测试可以检查将每个元素投影到字符串的结果。实际上,您可以非常轻松地将结果对象转换为字符串序列:

var strings = ((IEnumerable) result).Cast<object>.Select(x => x.ToString());

然后可能使用SequenceEqual测试strings

答案 1 :(得分:0)

创建一组相同的对象到您期望的对象,然后序列化它和单元测试下的动作的result.Data。最后,比较一下流是否相同。

答案 2 :(得分:0)

好吧,我发现它是你解决方案的一部分:) 显然我可以将它转换为IEnumerable,然后我可以迭代结果。 THX!

    var objects= ((IEnumerable)result.Data);
    foreach (object obj in objects)
    {
       //inhere i can use reflection to get the properties out of it
    }