Делаем DynamicMock MockInstance равным себе
Попытка использовать 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()
все же не удается, хотя.)
2 ответа
Отвечая себе, чтобы закрыть - ответ, кажется, "использовать Moq".
Мне любопытно, как ты мотивируешь себя использовать здесь. Кажется, что ваш тест был бы проще, если бы вы создали обычный экземпляр класса, который реализует ISomeInterface. Я полагаю, что в вашем случае не должно быть простых экземпляров конкретных классов. Если вы не можете заставить его работать с макетами, решение было бы реализовать конкретный класс только для этого теста.
Я не использовал nunit.mocks, я обычно использую Rhino Mocks, который обычно работает довольно хорошо, и также популярна среда Moq.