是否有.NET测试框架可以断言集合包含基于表达式的元素?

时间:2010-09-21 16:28:26

标签: .net unit-testing

我正在尝试测试我正在构建的某个函数会在提供一组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));

但我不知道是否存在这样的事情。

3 个答案:

答案 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")))

这有帮助吗?