Создать класс для тестирования - PullRequest
0 голосов
/ 11 февраля 2009

Мне нужно проверить метод, принадлежащий к классу обслуживания. Этот класс обслуживания имеет несколько зависимостей в конструкторе, некоторые из которых используются этим методом, некоторые нет. Если мы не должны использовать контейнер DI для наших модульных тестов, каков наилучший способ создания экземпляра класса обслуживания?

var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2(), etc.);

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

Ответы [ 3 ]

2 голосов
/ 11 февраля 2009

Иногда (особенно если это тестирование кода) небольшое переформатирование кода может помочь. Пока

var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2());

определенно трудно читать, это:

var service = new ServiceClass(
    new Repository1(), 
    new Repository2(), 
    new ServiceClass2()
);

кажется немного лучше (по крайней мере, мне).

2 голосов
/ 11 февраля 2009

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

var respository1 = MockRepository.GenerateMock<Repository1>();
repository1.Expect( r => r.SomeMethod() ).Return( someValue );

var repository2 = MockRepository.GenerateMock<Repository2>();
repository2.Expect( r => r.Method2() ).Return( someValue );

 ...

var service = new Service( repository1, repository2, ... );

repository1.VerifyAllExpectations();
repository2.VerifyAllExpectations();

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

Что касается количества параметров в конструкторе, рассмотрите возможность предоставления конструктора по умолчанию, который не принимает параметров, и наличия открытых сеттеров для зависимостей. Затем вы можете использовать механизмы удобства в C # 3.0 для их определения.

var service = new Service {
    Repository1 = repository1,
    Repository2 = repository2,
    ...
};
2 голосов
/ 11 февраля 2009

http://www.myjavatools.com/cuecards/refactoring.html

Конструктор → Фабричный метод

если вы хотите больше, чем простая конструкция

...