Moq статический метод в статическом классе
public Product GetbyID(int id)
{
try
{
//mycode Product p=..........
}
catch (DataAccessException ex)
{
throw new BusinessException(ex.ErrorCode);
}
catch (Exception ex)
{
BusinessExceptionHandler.LogException(ex);
}
return p;
}
Данный выше фрагмент кода, который мне нужен, чтобы написать тестовые примеры.
здесь LogException (ex); является статическим методом в статическом классе BusinessExceptionHandler
У меня есть ссылка на фреймовую работу Moq 2.6.1014.1
Как я могу использовать метод MOQ BusinessExceptionHandler.LogException
Я предпочитаю издевательский механизм, который не нуждается в изменении метода GetbyID
Ответы
Ответ 1
Moq не позволяет издеваться над статическими методами, поэтому вам, вероятно, придется изменить работу статического метода. Один из вариантов заключается в том, чтобы статический метод вызывал метод экземпляра зависимости. Таким образом, вы создадите класс "Logger" с методом Log и добавьте статическое поле Logger/property (BusinessExceptionHandler.Logger) в ваш статический класс. В реальном сценарии вы можете заполнить BusinessExceptionHandler.Logger стандартным экземпляром Logger, используя его как Singleton. Для тестирования вставьте Mock в BusinessExceptionHandler.Logger и настройте свои ожидания и проверите против макета.
Ответ 2
Moq (и NMock, RhinoMock) вам не помогут. Вам нужно будет создать класс-оболочку (и виртуальный метод) вокруг исключения LogException и использовать его в производственном коде и протестировать с помощью этого.
Или вы можете использовать такой инструмент, как TypeMock, Microsoft.Fakes и т.д. (http://stacktoheap.com/blog/2012/11/11/testing-extension-methods-with-microsoft-fakes/), если вы абсолютно не можете изменить существующий код.