Pilot
)对象的数组,这些对象具有一个可能为空的(Hanger
)属性,该属性本身具有一个(List<Plane>
)属性。出于测试目的,我想将其简化和“铺平”到一个匿名对象中,该对象具有属性 PilotName
(字符串)和 Planes
(数组),但不确定如何处理空的 Hanger
属性或空的 PlanesList
。(为什么使用匿名对象?因为我测试的 API 对象是只读的,我希望测试是“声明性”的:自包含、简单和易读...但我也愿意听取其他建议。此外,我正在尝试了解更多关于 LINQ 的知识。)
例子
class Pilot
{
public string Name;
public Hanger Hanger;
}
class Hanger
{
public string Name;
public List<Plane> PlaneList;
}
class Plane
{
public string Name;
}
[TestFixture]
class General
{
[Test]
public void Test()
{
var pilots = new Pilot[]
{
new Pilot() { Name = "Higgins" },
new Pilot()
{
Name = "Jones", Hanger = new Hanger()
{
Name = "Area 51",
PlaneList = new List<Plane>()
{
new Plane { Name = "B-52" },
new Plane { Name = "F-14" }
}
}
}
};
var actual = pilots.Select(p => new
{
PilotName = p.Name,
Planes = (p.Hanger == null || p.Hanger.PlaneList.Count == 0) ? null : p.Hanger.PlaneList.Select(h => ne
{
PlaneName = h.Name
}).ToArray()
}).ToArray();
var expected = new[] {
new { PilotName = "Higgins", Planes = null },
new
{
PilotName = "Jones",
Planes = new[] {
new { PlaneName = "B-52" },
new { PlaneName = "F-14" }
}
}
};
Assert.That(actual, Is.EqualTo(expected));
}
直接的问题是这条语句 expected... Planes = null
出现错误,错误原因是:
无法将
null
赋值给匿名类型属性,但承认潜在问题可能是在第一次使用null
在actual
中就不是最佳方法。
有没有想法可以将 expected
中的空数组赋值或采取与 actual
不同的方法而不使用 null
?
pilots.Where
调用创建的WhereSelectArrayIterator
)和一个数组之间的相等性。你可以在Where
子句的末尾使用ToArray()
将其强制转换为数组。 - Andras ZoltanPlanes
成为一个空集合而不是**null
**,当没有任何项时。这样处理起来会更容易;这里有一些背景阅读材料。其次,我怀疑你将不得不使实际和期望之间的相等检查更加“智能”;也就是说,它将不得不深入对象和集合,并使用类似SequenceEqual
的东西。 - AakashM