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/), если вы абсолютно не можете изменить существующий код.