Метод испытания для конструктора

Работа над планировщиком событий с 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);
        // ...
    }
}
Другие вопросы по тегам