2013-04-02 2 views
3

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

Нужно ли мне писать различные методы, чтобы проверить другую инициализации параметров в конструкторе? Также не то, что конструктор вызывает другой метод.

Каков наилучший способ написания методов тестирования для этого кода?

+8

Виртуальный вызов метода в конструкторе - не очень хорошая идея. – Tilak

+0

@ Тилак, я просто сделал этот метод виртуальным, потому что другое событие conf также может наследовать TechDay и изменить время начала и окончания. Пример: TechNights. Что может быть лучшим предложением? – Billa

+0

Billa, если вы можете правильно вызвать порядок вызовов между базовым конструктором, производным конструктором и виртуальными методами изнутри конструктора и какие поля будут/не будут инициализироваться при каждом вызове, чем это, вероятно, нормально. –

ответ

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); 
} 
+0

Выглядит хорошо, Как я могу проверить специальное событие, которое выпадает в любое время между 3-4 PM, с Assert – Billa

+0

@Billa, это необычно, что требование было бы это неточно, время обычно будет следовать правилу, и вы проверите это правило, создавая правильный результат. Но если это действительно то, что вам нужно сделать, я бы ожидал увидеть что-то в тесте, которое устанавливает логическое значение, показывающее, находится ли время между 3 и 16 часами, затем Assert.IsTrue (isBetweenThreeAndFourPm); –

+1

+1. Примечание. Нет необходимости использовать 'Parse' - построение DateTime непосредственно из часов/минут будет более компактным и менее подверженным ошибкам из-за проверки типа. Подумайте, лучше ли использовать 'TimeSpan', если значение DateTime не включает в себя часть ... –

1

Вы должны извлечь логику конфигурации в другой класс. Используйте интерфейсы для макета (см. 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); 
     // ... 
    } 
} 
Смежные вопросы