Использование делегата в качестве «фабричного метода» для модульного тестирования в C # - PullRequest
0 голосов
/ 03 декабря 2011

проблема

Давайте «нарисуем» картину ситуации:

  • У меня есть SUT. (хорошо иметь: P)
  • Я могу добавить некоторые зависимости от моего SUT.
  • В методе я делаю: новый OtherClass (ParametersObtainedFromDependancies).
  • Я хочу провести модульное тестирование этого метода в моем SUT без обработки сложности создания фиктивного объекта, который имеет смысл для правильной работы OtherClass. Это подразумевает тестирование OtherClass.

Мое решение для этого было фабричным методом с использованием делегата:

public Func<OtherClass,Param1Type> GetOtherClass = 
       (param1) => new OtherClass(param1);

Плохо: это публично. Вы можете думать об этом как о необязательной зависимости, которую вы можете переопределить при необходимости. Но в любом случае, общественность пахнет.

Хорошо: мне не нужно создавать MyTestSUT, который будет переопределять этот метод, или даже использовать макет на SUT для переопределения этого метода.

Вопрос

Есть ли лучшее решение? Это правильно?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Почему вы сделали это публичным полем? Похоже, что это в основном зависимость, как и любая другая: вы хотите что-то, что даст вам OtherClass, когда вы дадите ему некоторые другие значения. Почему бы просто не сделать его параметром конструктора, как другие зависимости (или, тем не менее, вы делаете оставшуюся часть внедрения зависимостей)?

Вы всегда можете обеспечить перегрузку конструктора без этого параметра, который при желании делегирует более длинный. Вот как я обычно предоставляю реализации зависимостей по умолчанию.

Другими словами: как это логически отличается от (скажем) интерфейса IAuthenticator, который при предоставлении имени пользователя и пароля вернет UserProfile? Вы используете делегат в качестве ярлыка, чтобы не объявлять интерфейс, но это всего лишь подробный IMO. Вы можете обнаружить, что со временем вы на самом деле хотите добавить больше умов в «обеспечение» - например, кэширование.

0 голосов
/ 03 декабря 2011

Звучит так, как будто вы хотите использовать что-то похожее на Автофиксирование с включенной настройкой AutoMoq .Это позволит вам смоделировать все или некоторые из ваших открытых полей в вашей SUT вместе с другими вашими параметрами конструктора, если вы хотите.

...