У меня вопрос по поводу юнит-тестирования заводского метода.Допустим, у нас есть следующий код и мы хотим протестировать метод Foo.ToBar.
class Bar
{
public Bar(int someparam)
{
}
}
class Foo
{
int m_someprivate;
public Foo()
{
m_someprivate = 1;
}
public Bar TooBar()
{
return new Bar(m_someprivate);
}
}
Я видел два разных метода.Одним из них будет что-то подобное
[Test]
void TooBarTest()
{
Foo foo = new Foo();
Bar result = foo.TooBar();
Assert.AreEqual(new Bar(1), result);
}
Это очень просто.Однако мне это не нравится по двум причинам
a) Мы случайно тестировали часть класса Bar при тестировании класса Foo.Например, если сработает конструктор Bar, то наш тест не пройдёт, что является неправильным, потому что класс Foo в порядке.Это класс Bar, у которого есть проблема.
b) Мне не нравится, что производственный код используется в Assert new Bar (1).Я бы предпочел использовать некоторую константу, чем некоторый код, который может в качестве примера возвращать разные результаты в зависимости от некоторого внешнего состояния (и т. Д.).
Другой метод, который я видел, основан на создании автономной фабрики, которая создастБар
class Bar
{
public Bar(int someparam)
{
}
}
interface IBarFactory
{
Bar create(int someparam);
}
class BarFactory : IBarFactory
{
public Bar create(int someparam)
{
return new Bar(someparam);
}
}
class Foo
{
int m_someprivate;
BarFactory m_barFactory;
public Foo()
{
m_someprivate = 1;
m_barFactory = new BarFactory();
}
public Bar TooBar()
{
return m_barFactory.create(m_someprivate);
}
public void setBarFactory(BarFactory barFactory)
{
m_barFactory = barFactory;
}
}
[Test]
void TooBarTest()
{
Mockery mockery = new Mockery()
IBarFactory barFactoryMock = mockery.NewMock<IBarFactory>();
Expect.Once.On(barFactoryMock).Method("create").With(new Object[] { 1 }).Will(Return.Value(new Bar(1));
Foo foo = new Foo();
foo.setBarFactory(barFactoryMock);
foo.ToBar();
}
Похоже, так лучше.Однако мне не нравится, что нам нужно создавать фабричный интерфейс, фабрику, настройщик фабрики и делать тест более сложным, просто чтобы протестировать 1 строку кода.
Что вы думаете об этом?Что Вы предпочитаете?У вас есть какой-нибудь другой метод тестирования?