У меня есть класс Foo, который использует другой класс Bar для некоторых вещей.
Я пытаюсь выполнить тестовую разработку, и поэтому пишу модульные тесты для Foo, чтобы убедиться, что он вызывает соответствующие методы для Bar, и для этой цели я использую внедрение зависимостей и Mocking Bar (используя Rhino Mocks) .
например. (в 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);
}
Я чувствую, что это делает Bar труднее в использовании.
Я подозреваю, что может быть какое-то решение, которое включало бы использование контейнера IoC, настроенного для внедрения Foo с фиктивным IBar, а также для предоставления доступа к созданному макету для проверки ожидаемого, но я чувствую, что это сделает Foo излишне сложным. Я использую только внедрение зависимостей, чтобы позволить мне смоделировать зависимости для тестирования, и поэтому в настоящее время я не использую контейнеры IoC, а просто строю зависимости в цепочечном вызове конструктора из конструкторов по умолчанию (хотя я понимаю, что это создает более непроверенный код) например,
public Foo() :
this(new Bar())
{
}
Кто-нибудь может порекомендовать лучший способ проверки построения / инициализации зависимого объекта?