Делаем 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.

Другие вопросы по тегам