У меня есть класс, который реализует 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
теперь тоже не работает.
Заключение:
В NUnit 2.4 ограничения коллекции требуют реализации не-универсального ICollection, чтобы коллекция распознавалась как коллекция (, отвечающая на исходный вопрос). Равенство IEnumerable работает, как и ожидалось.
В NUnit 2.6 (и, возможно, 3.0)равенство IEnumerable
s проверяется совпадающими элементами, даже если Equals
переопределено. Вот почему ограничение членства не работает, если элементы сами по себе являются IEnumerable
. Это известная проблема(https://bugs.launchpad.net/nunit-3.0/+bug/646786).
Подробнее см. мой собственный ответ.