Метод испытания для конструктора
Работа над планировщиком событий с TDD и написание тестового проекта для следующего класса.
Решил написать тестовые методы для конструктора логики
public class TechDay
{
public Session MorningSlot { get; set; }
public Session EveningSlot { get; set; }
public TechDay()
{
this.MorningSlot = new Slot();
this.EveningSlot = new Slot();
this.MorningSlot.Sessions= new List<Session>();
this.EveningSlot.Sessions= new List<Session>();
this.ConfigureEventSettings();
}
protected virtual void ConfigureEventSettings()
{
CultureInfo provider = CultureInfo.InvariantCulture;
this.MorningSlot.StartTime = DateTime.ParseExact("9:00 AM", "h:mm tt", provider);
this.MorningSlot.EndTime = DateTime.ParseExact("12:00 PM", "h:mm tt", provider);
this.EveningSlot.StartTime = DateTime.ParseExact("1:00 PM", "h:mm tt", provider);
this.EveningSlot.EndTime = DateTime.ParseExact("5:00 PM", "h:mm tt", provider);
}
}
Методы испытаний
[TestMethod]
public void CheckMorningSlot()
{
TechDay techday=new TechDay();
Assert.IsNotNull(techday.MorningSlot);
}
[TestMethod]
public void CheckEveningSlot()
{
TechDay techday=new TechDay();
Assert.IsNotNull(techday.EveningSlot);
}
[TestMethod]
public void CheckEveningSlotSessions()
{
TechDay techday=new TechDay();
Assert.IsNotNull(techday.EveningSlot.Sessions);
}
[TestMethod]
public void CheckMorningSlotSessions()
{
TechDay techday=new TechDay();
Assert.IsNotNull(techday.MorningSlot.Sessions);
}
Нужно ли писать разные методы для проверки инициализации разных параметров в конструкторе? Также не то, что конструктор вызывает другой метод.
Каков наилучший способ написания тестовых методов для этого кода?
2 ответа
Вы должны тестировать функциональные требования вашего кода, а не каждый бит кода. Так что за функциональность, которую вы тестируете? Если есть требование, чтобы утренний слот начинался в 9 утра, тогда ваш тест будет выглядеть примерно так:
[TestMethod]
public void Morning_slot_starts_at_nine_am()
{
var expected = DateTime.ParseExact("9:00 AM", "h:mm tt", CultureInfo.InvariantCulture);
var techDay = new TechDay();
var actual = techDay.MorningSlot.StartTime;
Assert.AreEqual(expected, actual);
}
Вы должны извлечь логику конфигурации в другой класс. Используйте интерфейсы для макета (см. Moq). И вы получите простые тесты.
public class TechDay
{
public Session MorningSlot { get; set; }
public Session EveningSlot { get; set; }
public TechDay(IEventConfigurator morningConfigurator, IEventConfigurator eveningConfigurator)
{
MorningSlot = new Session();
morningConfigurator.Configure(MorningSlot);
EveningSlot = new Session();
eveningConfigurator.Configure(EveningSlot);
}
}
public interface IEventConfigurator
{
void Configure(Session session);
}
public class Session
{
public static DateTime StartTime { get; set; }
public static DateTime EndTime { get; set; }
}
public class FromStringEventConfigurator : IEventConfigurator
{
private readonly string _begin;
private readonly string _end;
public FromStringEventConfigurator(string begin, string end)
{
_begin = begin;
_end = end;
}
public void Configure(Session session)
{
CultureInfo provider = CultureInfo.InvariantCulture;
Session.StartTime = DateTime.ParseExact(_begin, "h:mm tt", provider);
Session.EndTime = DateTime.ParseExact(_end, "h:mm tt", provider);
// ...
}
}