У меня есть класс Foo, который использует другой класс Bar, чтобы сделать что-то.Конструкция/инициализация объекта тестирования объекта
Я пытаюсь выполнить тестовую разработку, и поэтому я пишу модульные тесты для Foo, чтобы убедиться, что он называет соответствующие методы в Bar, и для этой цели я использую инъекцию зависимостей и издевательскую Bar (используя Rhino Mocks).
E.g. (В C#):
class Foo
{
private IBar bar= null;
public Foo(IBar bar)
{
this.bar= bar;
}
public void DoSomething()
{
bar.DoIt();
}
}
class FooTests
{
...
void DoSomethingCallsBarsDoItMethod()
{
IBar mockBar= MockRepository.GenerateMock<IBar>();
mockBar.Expect(b=>b.DoIt());
Foo foo= new Foo(mockBar);
foo.DoSomething();
mockBar.VerifyAllExpectations();
}
}
Это все, кажется, хорошо, но я на самом деле хочу Bar быть сконфигурирован с определенным параметром, и будет иметь этот параметр, переданный в через конструктор Foo в. . (В C#):
public Foo(int x)
{
this.bar = new Bar(x);
}
Я не уверен, что лучший способ изменить это, чтобы быть более легко проверяемым. Один из вариантов, о котором я могу думать, включает в себя перемещение инициализации Bar из его конструктора, например.
public Foo (IBar bar, int x)
{
this.bar= bar;
this.bar.Initialize(x);
}
Я чувствую, что это делает Бар более сложным в использовании.
Я подозреваю, что может быть какое-то решение, которое предполагает использование контейнера IoC, предназначенного для инъекции Foo с помощью Mock IBar, а также обеспечения доступа к созданному макету для проверки достоверности, но я считаю, что это сделает Foo излишне сложным , Я использую только инъекцию зависимостей, чтобы позволить мне издеваться над зависимостями для тестирования, и поэтому я не использую контейнеры IoC в настоящее время, просто конструируя зависимости в цепочном вызове конструктора от конструкторов по умолчанию (хотя я понимаю, что это создание более непроверенного кода) например
public Foo() :
this(new Bar())
{
}
Может ли кто-нибудь рекомендовать лучший способ проверить конструкцию/инициализацию зависимых объектов?
Foo не заботится о x, за исключением того факта, что Bar должен быть инициализирован им. Я уточнил свой вопрос, чтобы прояснить это. Благодарю. – Ergwun
@Ergwun: Если Foo не заботится о x, просто создайте Bar с x и введите его в Foo. Если x не может быть известно до времени выполнения, используйте абстрактную фабрику для создания IBar в Foo - см. Последнюю ссылку моего ответа. –
Попытавшись это на некоторое время, я нашел это использование фабрики абстрактных рисунков, чтобы быть чрезвычайно полезным для этой проблемы. Благодаря! – Ergwun