Rhino Mocks - использование AssertWasCalled на Common.Ведение журнала ILog.Отладка
-
20-09-2019 - |
Вопрос
У меня возникли проблемы с использованием 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 работает нормально.