Rhino Mocks - использование AssertWasCalled на Common.Ведение журнала ILog.Отладка

StackOverflow https://stackoverflow.com/questions/1943801

Вопрос

У меня возникли проблемы с использованием Rhino Mocks, чтобы утверждать, что был вызван метод (и в идеале с определенным параметром).Этот метод называется ILog.Отладка (FormatMessageHandler) в Обычный.Ведение журнала 2.0 используя новый синтаксис lamba.Он отлично работает, используя старый способ простого ILog.Debug (строка).

    // Sample Code to Test
    public int TestFuncLambda(ILog log, int a, int b)
    {
        log.Debug(m => m("TestFunc START"));

        int c = a + b;

        log.Debug(m => m("TestFunc END"));

        return c;
    }

    public int TestFunc(ILog log, int a, int b)
    {
        log.Debug("TestFunc START");

        int c = a + b;

        log.Debug("TestFunc END");

        return c;
    }

    [TestMethod]
    public void Should_log_start_TestFuncLamba()
    {
        var logger = MockRepository.GenerateMock<ILog>();

        logger.Stub(x => x.IsDebugEnabled).Return(true);

        TestFuncLambda(logger, 1, 2);

        // Doesn't work, says zero calls plus I'm not sure how to check for the word "START" in the string either
        logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());
    }

    [TestMethod]
    public void Should_log_start_TestFunc()
    {
        var logger = MockRepository.GenerateMock<ILog>();
        logger.Stub(x => x.IsDebugEnabled).Return(true);

        TestFunc(logger, 1, 2);

        // Works fine
        logger.AssertWasCalled(x => x.Debug(Arg<string>.Matches(Text.Contains("START"))));
    }
Это было полезно?

Решение 3

Я понял.Мне не хватало части действия для делегата.Правильный синтаксис:

logger.AssertWasCalled(x => x.Debug(Arg<Action<FormatMessageHandler>>.Is.Anything));

скорее, чем

logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());

Как уже упоминалось, o.IgnoreArguments() был избыточным и ненужным.

Другие советы

Я собираюсь предположить здесь, что вы просто возитесь с Rhinomocks, и это не имеет никакого отношения к системе ведения журнала, верно?Я говорю это потому, что в ваших тестах нет конкретных реализаций, только издевательства.

Без тестирования вашего кода эта строка выглядит так, как будто она всегда будет равна нулю:

logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());

потому что ваш фактический метод TestFunc() передает строки в log.Debug, а не FormatMessageHandler:

Таким образом, было бы логично, если бы количество вызовов было равно нулю.Добавьте строку в TestFunc() следующим образом:

log.Debug(new FormatMessageHandler());

и посмотрим, исправит ли это ситуацию.

Сначала создайте конкретный класс, чтобы проверить, вызывается ли в TestFuncLambda правильный метод Debug().Это гарантирует, что он не выполняет какое-то странное преобразование лямбды в строку.

Убедившись, что должна вызываться правильная версия, вы изолировали проблему с RhinoMocks.Это может быть ошибка, связанная с имитацией носорога.Итак, давайте уменьшим набор ошибок, но обернем лямбду в новый FormatMessageHandler(), прежде чем передавать его в Debug.Это гарантирует, что вызывается правильная имитируемая функция, а не транслируется как что-то другое.

Если на данный момент вы не обнаружили ошибку и она по-прежнему не работает, попробуйте создать экземпляр FormatMessageHandler() и сохранить его как статическую переменную-член (просто чтобы проверить, что не так).Передайте это, сохраненное при вызове TestFuncDebug в Debug() и вызове AssertWasCalled().Если это не сработает, то у меня закончились идеи.

Кстати, я не знаю, что такое IgnoreArguments(), но мне никогда не приходится вызывать его в вызовах RhinoMocks к AssertWasCalled.Обычно Arg<>.Is.Anything работает нормально.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top