Что делает класс коллекцией в соответствии с ограничениями коллекций NUnit?

У меня есть класс, который реализует ICollection. Ограничения коллекций NUnit не распознают его как коллекцию.

напр. Assert.That( sut, Has.No.Member( someObjectOfTypeSomeConcreteClass ) );выдаетSystem.ArgumentException : The actual value must be a collection

и Assert.That( sut, Is.Empty );терпит неудачу с пустым sut.

Итак, когда коллекция является коллекцией (согласно NUnit)?

Трассировка стека:

System.ArgumentException : The actual value must be a collection Parametername: actual
at NUnit.Framework.Constraints.CollectionConstraint.Matches(Object actual)
at NUnit.Framework.Constraints.NotConstraint.Matches(Object actual)
    MyTestFile.cs(36,0): at MyAssembly.MyTestFixture.MyTestMethod()

Вышеупомянутые проблемы возникли с NUnit 2.4.3.0. Только что попробовал на 2.6. Is.Emptyтеперь работает, но Has.No.Memberпо-прежнему не работает. Он даже не вызывает Equals()или operator ==(). Как он сравнивает элементы коллекции? RhinoMocks Arg.List.Count( Is.Equal( 1 ) )теперь тоже не работает.

Заключение:
В NUnit 2.4 ограничения коллекции требуют реализации не-универсального ICollection, чтобы коллекция распознавалась как коллекция (, отвечающая на исходный вопрос). Равенство IEnumerable работает, как и ожидалось.

В NUnit 2.6 (и, возможно, 3.0)равенство IEnumerables проверяется совпадающими элементами, даже если Equalsпереопределено. Вот почему ограничение членства не работает, если элементы сами по себе являются IEnumerable. Это известная проблема(https://bugs.launchpad.net/nunit-3.0/+bug/646786).

Подробнее см. мой собственный ответ.

5
задан EricSchaefer 12 March 2012 в 19:06
поделиться