Существует ли среда тестирования .NET, которая может утверждать, что коллекция содержит элементы на основе выражения?

Я пытаюсь проверить, что определенная функция, которую я создаю, будет добавлять объекты в коллекцию, если она снабжена набором идентификаторов.

Мой тест выглядит примерно так:

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
}

Я хочу убедиться, что все идентификаторы, которые я создал в своем тесте, добавляются в someClass.IdsInClass.

Как лучше всего это сделать?

Я подумал, может быть, выражение будет работать так:

Assert.That(someClass.IdsInClass, 
    List<SomeOtherClass>.HasAll(x => someIds.Contains(x.Id));

Но я не знаю, существует ли что-то подобное.


person Joseph    schedule 21.09.2010    source источник


Ответы (3)


Я бы использовал Linq's All...

Assert.True( someIds.All( id => someClass.IdsInClass.Contains( id ) ) );
person µBio    schedule 21.09.2010
comment
О, теперь это выглядит интересно. Я никогда не видел этого раньше. Я посмотрю, смогу ли я использовать это для своего модульного теста, спасибо! - person Joseph; 21.09.2010
comment
Assert.True(someIds.All(someClass.IdsInClass.Contains)); - person smnbss; 21.01.2011

В Gallio/MbUnit есть специальное утверждение для этого конкретного теста:

Assert.ForAll(someIds, id => someClass.IdsInClass.Contains(id));

Преимущество заключается в том, что Gallio сообщает, какие конкретные элементы последовательности не работают (если таковые имеются). Это, безусловно, лучше, чем просто получить общее сообщение о том, что выражение, оцениваемое Assert.IsTrue, просто неверно.

person Yann Trevin    schedule 22.09.2010

Вы можете использовать выражения LINQ, которые разрешаются в логическое значение. Например, я пишу код, подобный следующему, с тестами NUnit:

List<string> items = ...
Assert.That(items.All(item => item.Contains("x")))

Это помогает?

person jrummell    schedule 21.09.2010
comment
Вроде. Что я хочу сделать, так это убедиться, что ВСЕ Гиды, которые у меня есть в моем списке, отображаются в другой коллекции. Просто иметь его недостаточно. - person Joseph; 21.09.2010
comment
Как предложил BioBuckyBall, вы можете использовать метод расширения All Linq вместо Any. - person jrummell; 21.09.2010