我正在尝试测试我正在构建的某个函数会在提供一组ID时将对象添加到集合中。
我的测试看起来像这样:
var someClass = new SomeClass();
var someIds = new List<Guid> { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
someClass.AddIds(someIds);
Asset.That(someClass.IdsInClass, List.???);
属性IdsInClass实际上是一个IList,为了论证,我们可以说它看起来像这样:
public class SomeOtherClass
{
public Guid Id { get; set; }
public SomeClass Parent { get; set; }
//other properties we don't care about for this test
}
我想确保我在测试中创建的所有id都被添加到someClass.IdsInClass
最好的方法是什么?
我在想,也许表达式会这样:
Assert.That(someClass.IdsInClass,
List<SomeOtherClass>.HasAll(x => someIds.Contains(x.Id));
但我不知道是否存在这样的事情。
答案 0 :(得分:3)
我会使用Linq的All ...
Assert.True( someIds.All( id => someClass.IdsInClass.Contains( id ) ) );
答案 1 :(得分:1)
Gallio/MbUnit中有针对该特定测试用例的专用断言:
Assert.ForAll(someIds, id => someClass.IdsInClass.Contains(id));
好处是Gallio告诉序列的哪些特定元素失败(如果有的话)。这肯定比获得一条通用消息更好,表明由Assert.IsTrue
评估的表达式不正确。
答案 2 :(得分:0)
您可以使用解析为布尔值的LINQ表达式。例如,我使用NUnit测试编写类似于以下内容的代码:
List<string> items = ...
Assert.That(items.All(item => item.Contains("x")))
这有帮助吗?