2010-02-25 6 views
1

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

Мой бизнес класс полон методов с подобной реализации, как:

var rep=new NHrepository<ModelClass1>(Session); 
rep.Where(x=>x.Field1==1).ToList(); 

первая ошибка (с моей точки зрения), что я не должен использовать «новый», но вместо того, чтобы использовать DI и добавьте в параметры ctor INHrepository modelClass1Repository.

Если в моем классе у меня есть два или более хранилища разных классов модели? Каждый должен быть в ctor? Или, возможно, бизнес-класс не построен с принципом SeparationOfConcern?

ответ

1

Вы правы насчет инъекции dependecy.

Кроме того, я настоятельно рекомендую вам прочитать Working Effectively with Legacy Code, если вы планируете писать модульные тесты для устаревшего кода.

1

Один широко используемый подход заключается в п репозиториев в качестве параметров для ваших конструкторов, как вы уже подозревали

Другой часто используемый подход заключается в использовании рамки инъекции зависимостей, таких как Ninject. Это позволяет писать такие вещи, как:

[Inject] 
public IAbstractRepository<Company> companiesRepository { get; private set; } 

[Inject] 
public IAbstractRepository<User> usersRepository { get; private set; } 

Вы можете иметь Ninject вводить соответствующую реализацию вашего интерфейса в зависимости от сценария использования (например, поддельный хранилище для тестирования или реальное хранилище для производства)

+0

Я думаю, что это неправильный подход, поскольку свойство может быть выделено «не установлено», но параметр ctor не может. В моем случае репозиторий ДОЛЖЕН быть установлен, поэтому я предполагаю, что лучше оставить его в ctor. –

+0

Я думаю, что вы неправильно понимаете приведенный выше пример кода. В приведенном выше примере репозитории всегда будут автоматически создаваться (другими словами, устанавливаться) автоматически Ninject всякий раз, когда вы создаете объект, содержащий эти свойства. Невозможно забыть создавать копии ваших репозиториев. Я не вижу серьезных отличий от их создания с помощью конструктора, за исключением того, что это меньше усилий и делает ваш код более гибким. –

0

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