【发布时间】:2013-01-14 10:57:05
【问题描述】:
我有任何具有 (Hanger) 属性的 (Pilot) 对象数组,它可能为 null,它本身具有 (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 行错误,
不能分配给匿名类型属性,但承认潜在的问题可能是在
actual中使用null是使用null并不是最好的方法。
任何想法如何在expected 中分配空数组或采用与actual 中的null 不同的方法?
【问题讨论】:
-
更新示例的主要问题是因为您正在检查枚举数(由
pilots.Where调用创建的WhereSelectArrayIterator)和数组之间的相等性。您可以在Where子句末尾使用ToArray()将其强制放入数组中。 -
对于更广泛的问题,我想说两件事:首先,要考虑的一个很好的改变是让(例如)
Planes成为一个 空集合 而不是null,当没有任何项目时。处理起来容易得多; here's some background reading。其次,我怀疑您将不得不使实际和预期之间的相等性检查更加“智能”;即,它必须深入研究对象和集合,并使用SequenceEqual之类的东西。 -
@AndrasZoltan:你是对的,问题现在更正了:)
-
@AakashM:空集合:我做了背景阅读,我同意,但我无法在我的代码中获得所需的更改。你能建议一个修复吗?谢谢。 p.s.你对断言也是正确的:)
-
嗯,当然有时-
nullHanger更难......也许是Null Object Pattern。对于集合,只需返回Enumerable.Empty<type>而不是null。
标签: c# linq anonymous-types