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