联合JsonResult如果项目是匿名类型,为什么我无法通过动态访问

时间:2013-03-25 21:43:34

标签: c# json unit-testing dynamic

我的方法看起来像:

public JsonResult GetSpecies()
        {
            var species = new List<SpeciesType> {
                                                new SpeciesType{ Id=1, Name="Giraffe" },
                                                new SpeciesType{ Id=2, Name="Wolf" }
                                            };

            return Json(new { Species = species });
        }

然后我进行了组装,使其内部可见我的测试项目并进行了测试:

[TestMethod]
        public void GetSpecies_ReturnsJsonVersionOfNameAndId()
        {
            ...

            var result = controller.GetSpecies();

            dynamic data = result.Data;

            Assert.AreEqual(1, data.Species[0].Id);
            Assert.AreEqual("Giraffe", data.Species[0].Name);
            Assert.AreEqual(2, data.Species[1].Id);
            Assert.AreEqual("Wolf", data.Species[1].Name);
        }

所以这很好。

我改变了方法以返回数组中的匿名类型:

public JsonResult GetSpecies()
            {
                var species = new List<SpeciesType> {
                                                    new SpeciesType{ Id=1, Name="Giraffe" },
                                                    new SpeciesType{ Id=2, Name="Wolf" }
                                                }.Select(x => new { Id = x.Id, Name = x.Name });

                return Json(new { Species = species });
            }

现在测试会抛出异常。

任何人都可以解释为什么会发生这种情况以及如何解决?

1 个答案:

答案 0 :(得分:3)

您现在没有提供List<T> - 您的Species属性只是一个序列。我不知道它是如何在JSON中表示的,如果实际越过网络,它可能没问题 - 但是确保Species值实际上是最简单的清单:

var species = new List<SpeciesType> {
                                    new SpeciesType{ Id=1, Name="Giraffe" },
                                    new SpeciesType{ Id=2, Name="Wolf" }
                                }
    .Select(x => new { Id = x.Id, Name = x.Name })
    .ToList();