Moq статический метод в статическом классе - PullRequest
14 голосов
/ 29 января 2012
 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

Как я могу использовать метод BusinessExceptionHandler.LogException

Я предпочитаю насмешкумеханизм, который не требует каких-либо изменений в методе GetbyID

Ответы [ 3 ]

18 голосов
/ 29 января 2012

Moq не допускает насмешки над статическими методами, поэтому вам, вероятно, придется изменить работу статического метода.Один из вариантов заключается в том, чтобы статический метод вызывал экземплярный метод зависимости.Таким образом, вы создадите класс «Logger» с помощью метода Log и добавите статическое поле / свойство Logger (BusinessExceptionHandler.Logger) в ваш статический класс.В реальном сценарии вы можете заполнить BusinessExceptionHandler.Logger стандартным экземпляром Logger, используя его в качестве Singleton.Для тестирования вставьте Mock в BusinessExceptionHandler.Logger, настройте свои ожидания и проверьте на соответствие.

8 голосов
/ 30 января 2012

Moq (и NMock, RhinoMock) здесь вам не помогут.Вам нужно будет создать класс-оболочку (и виртуальный метод) вокруг LogException и использовать его в рабочем коде и протестировать его.

Или вы можете использовать такие инструменты, как TypeMock, Microsoft.Fakes и т. Д. (http://stacktoheap.com/blog/2012/11/11/testing-extension-methods-with-microsoft-fakes/), если абсолютно не можете изменить существующий код.

2 голосов
/ 17 апреля 2018

Вот как мне обойти эту проблему.Скажем, это класс, который вы хотите протестировать модулем:

 public static class TaskFactory
 {
   public static T CreateTask<T>(long workRequestId, ProcessTriggerType workRequestType)
   {
     var task = some code to do the work;
     return (T)task;
   }
 }

Создайте интерфейс и реализующий его класс-оболочку:

public interface ITaskFactoryFacade
  {
    T CreateTask<T>(long workRequestId, ProcessTriggerType workRequestType);
  }

  public class TaskFactoryFacade : ITaskFactoryFacade
  {
    public T CreateTask<T>(long workRequestId, ProcessTriggerType workRequestType)
    {
      return TaskFactory.CreateTask<T>(workRequestId, workRequestType);
    }
  }

Теперь смоделируйте этот класс:

var taskFactoryFacadeMock = new Mock<ITaskFactoryFacade>();
taskFactoryFacadeMock.Setup(t => t.CreateTask<SomeTask>(It.IsAny<long>(), It.IsAny<SomeType>())).Returns(new SomeTask());

Happy Moqing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...