2013-04-02 5 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

@Tilak, 다른 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

괜찮아요. 어쌔 트 – Billa

+0

@Billa와 함께 오후 3 시부 터 오후 4 시까 지 진행되는 특별 이벤트를 어떻게 확인합니까? 요구 사항이 비정상적입니다. 정확하지 않은 경우, 시간은 일반적으로 규칙을 따르며, 해당 규칙이 올바른 결과를 산출하는지 테스트하게됩니다. 그러나 이것이 정말로 필요한 경우라면 테스트에서 시간이 오후 3시에서 4시 사이인지를 나타내는 부울 값을 설정하는 무언가를 볼 것으로 예상합니다. 그러면 Assert.IsTrue (isBetweenThreeAndFourPm); –

+1

+1. 주 -'Parse'를 사용할 필요가 없습니다 - 시간/분에서 직접 DateTime을 생성하는 것이 형식 검사로 인해 더 작고 오류가 발생하기 쉬울 것입니다. 'DateTime'값에 부분 자체가 포함되지 않은 경우 'TimeSpan'을 사용하면 더 잘 보이는지 고려하십시오. –

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); 
     // ... 
    } 
}