Я пытался обмотать голову вокруг модульного тестирования, и я пытаюсь разобраться с модулем тестирования функции, возвращаемое значение которой зависит от множества параметров. Там очень много информации, однако и это немного подавляющим ..Тестирование модулей с несколькими входами
Рассмотрим следующий пример:
У меня есть класс Article
, который имеет коллекцию цен. Он имеет метод GetCurrentPrice
который определяет текущую цену, основанную на несколько правил:
public class Article
{
public string Id { get; set; }
public string Description { get; set; }
public List<Price> Prices { get; set; }
public Article()
{
Prices = new List<Price>();
}
public Price GetCurrentPrice()
{
if (Prices == null)
return null;
return (
from
price in Prices
where
price.Active &&
DateTime.Now >= price.Start &&
DateTime.Now <= price.End
select price)
.OrderByDescending(p => p.Type)
.FirstOrDefault();
}
}
PriceType
перечисления и Price
класса:
public enum PriceType
{
Normal = 0,
Action = 1
}
public class Price
{
public string Id { get; set; }
public string Description { get; set; }
public decimal Amount { get; set; }
public PriceType Type { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public bool Active { get; set; }
}
Я хочу, чтобы создать модульный тест для метода GetCurrentPrice
. В принципе, я хочу проверить все комбинации правил, которые могут произойти, поэтому мне нужно будет создать несколько статей, чтобы содержать различные комбинации цен, чтобы получить полный охват.
Я имею в виду испытания устройства, такие как этот (псевдо):
[TestMethod()]
public void GetCurrentPriceTest()
{
var articles = getTestArticles();
foreach (var article in articles)
{
var price = article.GetCurrentPrice();
// somehow compare the gotten price to a predefined value
}
}
Я читал, что «множественным утверждает зло», но мне не нужно их проверить все условия здесь? Или мне понадобится отдельный блок тест на состояние?
Как я могу получить модульный тест с набором тестовых данных? Должен ли я высмеивать репозиторий? И должны ли эти данные также включать ожидаемые значения ?
Что такое 'unit' в этом случае? Я просто хочу знать, работает ли функция GetCurrentPrice. Является ли каждый отдельный вход «единицей» и правильность метода зависит от всех этих модульных тестов? Или это сам метод? – diggingforfire
@ diggingforfire, нет «единицы». Но это потому, что ваш код разработан таким образом, что нет «единицы». Класс 'Article' делает 2 вещи: у него есть свойства для хранения некоторых данных, и он содержит метод для управления этими данными. Таким образом, вы не можете тестировать эти 2 отдельно. Если вы хотели бы отделить эти обязанности, вы могли бы определить «GetCurrentPrice» в отдельном классе репозитория, который в качестве аргумента принимал бы экземпляр «Article». –
Не может ли это привести к модели анемичного домена? Я бы предпочел, чтобы сама «статья» содержала эту логику. Кажется, что тестирование устройства немного сложнее, но .. – diggingforfire