2010-01-13 3 views
4

У меня есть сценарий тестирования, где я хочу проверить, равны ли две коллекции. Я нашел класс Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert, но он работает только на ICollection<T>. Поскольку я тестирую репозиторий для Entity Framework, и поэтому вам нужно сравнить IObjectSet<T> s, что не будет сделано - IObjectSet<T> не реализует ICollection<T>.Можно ли использовать Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert на IEnumerable <T>?

Можно ли использовать этот класс для сравнения коллекций, или мне нужно создать собственную реализацию? (И почему, черт возьми, не команда Microsoft сделать работу класса с IEnumerable<T> вместо этого, так как это «базовый интерфейс» для коллекций?)

EDIT: Это мой тестовый код:

// Arrange 
var fakeContext = new FakeObjectContext(); 
var dummies = fakeContext.Dummies; 
var repo = new EFRepository<DummyEntity>(fakeContext); 

// Act 
var result = repo.GetAll(); 

// Assert 
Assert.IsNotNull(result, NullErrorMessage(MethodName("GetAll"))); 
Assert.IsInstanceOfType(result, typeof(IEnumerable<DummyEntity>), IncorrectTypeMessage(MethodName("GetAll"), typeof(IEnumerable<DummyEntity>))); 
CollectionAssert.AreEqual(dummies.ToList(), result.ToList()); 

CollectionAssert.AreEqual Вызов последней строки невозможен, указав, что элементы с индексом 0 не равны. Что я делаю не так?

ответ

3

Навязчивый вариант (не так много информации) заключается в том, чтобы утверждать, что expected.SequenceEqual(actual) возвращает true.

Вы можете написать метод обертки, который заставляет коллекцию (.ToList() на каждом)? Но, честно говоря вы можете также просто позвонить .ToList() в единичном тестовом коде:

CollectionAssert.AreEqual(expected.ToList(), actual.ToList()); // but tidier... 
+0

С '.ToList()' вызывает все мои коллекции, код компилируется. Тем не менее, я не могу написать тест, который я могу пройти, - см. Код, который я предоставил в редактировании на мой пост. –

+0

Выключает реализацию '.Equals()' на 'DummyEntity', сделал трюк. –

2

Если вы сравниваете наборы результатов вы можете использовать CollectionAssert.AreEquivalent, который будет игнорировать заказ. Вы также должны убедиться, что вы внедрили Equals на тип элементов, которые вы сравниваете.

+0

Я действительно хочу, чтобы утверждение заботилось о порядке, но реализовало '.Equals()' в сочетании с вызовом '.ToList()' в коллекциях (которые мне все равно пришлось бы использовать 'CollectionAssert.AreEquivalent', вот почему он получил репутацию, а не вы) сделал трюк. Благодаря! –

Смежные вопросы