Попытка использовать NUnit для проверки метода, который добавляет объект в очередь и выдает исключение, если объект уже был помещен в очередь, но это не удается, поскольку Queue.Contains()
не может обнаружить, что фиктивный объект уже находится в очереди.
Тестируемый метод довольно прост:
public void Enqueue(ISomeInterface obj) {
if (myQueue.Contains(obj)) {
throw new InvalidOperationException("Already queued");
}
myQueue.Enqueue(obj);
}
И вот тест:
[Test()]
public void TestQueueAlreadyQueued()
{
DynamicMock mock = new DynamicMock(typeof (ISomeInterface));
ISomeInterface obj = (ISomeInterface) mock.MockInstance;
queueulator.Enqueue(obj);
try {
queueulator.Enqueue(obj);
Assert.Fail("Exception expected");
} catch (InvalidOperationException e) {
// test passed
}
}
Это не удается - myQueue.Contains(obj)
всегда возвращает false, даже если другие тесты доказывают, что он добавляется в очередь.
Если добавить к тесту следующее утверждение -
Assert.AreEqual(obj, obj);
- не получается.
Я пытался добавить mock.ExpectAndReturn("Equals", true, obj)
, но, похоже, этого не происходит - я получаю "Слишком много вызовов равных / ожидаемых: верно / но было: ложно".
И, честно говоря, мне все равно, сколько раз вызывается Equals
- я не пытаюсь написать такой строгий тест. Есть ли простой способ настроить Equals
, чтобы он вел себя "нормально" здесь?
(И, как примечание, есть ли более продвинутая библиотека для макетирования .NET, которую я должен использовать? Я новичок в .NET, и после использования таких вещей, как Mockito в Java, NUnit.Mocks кажется довольно 2005 г.
ETA: Я начал использовать Moq , увидев благоприятную заметку от автора Mockito ; код немного менее загроможден и Contains()
работает, так что это начало. (Как ни странно, AreEqual()
все равно не получается.)