Делая DynamicMock MockInstance равным себе - PullRequest
2 голосов
/ 28 октября 2010

Попытка использовать 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 ]

0 голосов
/ 19 января 2011

Отвечая на вопрос, чтобы закрыть - ответ, кажется, "использовать Moq."

0 голосов
/ 29 октября 2010

Мне любопытно, как вы мотивируете использовать макет здесь.Кажется, что ваш тест был бы проще, если бы вы создали обычный экземпляр класса, который реализует ISomeInterface.Я полагаю, в вашем случае не должно быть простых экземпляров конкретных классов.Если вы не можете заставить его работать с макетами, решение было бы реализовать конкретный класс только для этого теста.

Я не использовал nunit.mocks, я обычно использую Rhino Mocks, который обычно работает довольнону, а также популярный фреймворк Moq.

...