Допустим, у меня есть класс, у которого есть метод для чего-то вычислить (неважно какой). Это может выглядеть примерно так:
class Example
{
public int CalculateStuff(int inputValue)
{
// ...some logic here
}
}
Но inputValue
всегда берется из самого класса. Вместо этого это могло бы выглядеть так:
class Example
{
public int InputValue { get; set; }
public int CalculateStuff()
{
// ...calculate something from 'InputValue'
}
}
Отлично, но я хотел бы добавить модульный тест к CalculateStuff()
, поэтому вот мой вопрос:
What лучший способ сделать четкий тест? Я мог бы просто установить значение класса в тесте, например:
void UnitTest()
{
var example = new Example();
example.InputValue = 42;
Assert.AreEqual(84, example.CalculateStuff());
}
Однако я мог бы также создать метод CalculateStuff()
a static
с нестатической c перегрузкой, а затем протестируйте часть stati c. Преимущество этого (насколько я могу судить) заключается в том, что он также будет работать в сценарии, где InputValue
- это что-то вроде DateTime.Now
:
class Example
{
public int InputValue { get; set; }
public int CalculateStuff()
{
return CalculateStuff(InputValue);
}
public static int CalculateStuff(int inputValue)
{
// ...calculate something from 'inputValue'
}
}
void UnitTest()
{
Assert.AreEqual(84, Example.CalculateStuff(42));
}
Есть ли широко распространенный способ сделать это ? И если да, то какие? Или это зависит от конкретного случая c?
Обновление
Другой пример, который немного отличается (но в той же категории), если вход был типа DateTime
, который в производстве всегда использовал DateTime.Now
в качестве входных данных (например, для вычисления времени с момента некоторого события). Это означало бы, что класс Example
всегда имел свойство со значением DateTime.Now
, если следовать первому подходу:
public int CalculateDateStuff(DateTime untilDtm)
{
// ...logic and stuff
}
, которое затем вызывается следующим образом:
var result = example.CalculateDateStuff(DateTime.Now);
... по крайней мере, если это должно быть проверено.