2015-09-16 4 views
4

Я хочу проверить функцию с сигнатурой типанасмешливый «новый()» ограничение с Moq

public static void DoSomething<T>(T something) 
    where T : class, IInterfaceA, IInterfaceB, new() 

, который использует new T() внутренне.

У меня проблемы с созданием макета для T. Благодаря другому вопросу, я уже нашел решение для mocking multiple interfaces. Однако я не могу создать макет, удовлетворяющий ограничению new(). Как решить эту проблему с помощью Moq?

+1

Вы не являетесь ИМО - вы можете создать Dummy-класс и использовать Moq внутри него - см., Как только вы используете новое, вы все равно теряете соединение с вашей подделкой - и BTW: кажется, что это немного запах, если вы используйте 'new' there – Carsten

+0

Вместо использования' new() 'constraint, вы должны добавить параметр' Func create' в 'DoSomething()' и вызвать это, чтобы создать объект, а не 'new' его. Точно, как создать объект, это не то, о чем должно знать DoSomething(). –

+0

'DoSomething' - статический метод, поэтому вы не сможете подделать его с помощью' moq' ... Ваши усилия по издевательствам ограничения 'new()' бесполезны .... –

ответ

1

У вас есть два варианта:

  1. Используйте рамки непринужденности насмешливых. В .NET это означает либо Isolator, либо JustMock. Оба используют IL-плетение для инъекции кода во время выполнения и могут подделывать/имитировать объект, который создается внутри производственного кода.
  2. Split DoSomething логика и использование инъекции зависимостей вместо создания объекта как части логики.

Выбор между ними зависит от того, насколько трудно разделить логику, имеет ли оставшийся код достаточно «мяса» в нем, и если вы готовы платить за Mocking рамки, которые могут подделать новый

+0

Вы правы. По сути, я злоупотребляю 'new()' ограничением, чтобы избежать более явного решения, передавая функцию конструктора. –

Смежные вопросы