2009-05-19 58 views
2

我無法找到它是否可以做到這一點的任何信息。如何在VS2008中使用集成的單元測試來測試抽象類

我有抽象類內的幾個受保護的方法,並想測試這些。我不想從類繼承並測試它的實現(除了技術上不嚴格的單元測試,VS2008也不會讓你測試繼承的方法)。

我想在集成單元測試的上下文中解決這個問題......我知道,例如nUnit將允許你這樣做。

有什麼想法?建議?

回答

1

VS2008可以測試從基類繼承的私有和受保護的方法,甚至抽象的。

如果你很高興測試這種方式然後右鍵單擊要測試的代碼並創建單元測試。

這裏有一段代碼裏面我是用測試私有繼承功能的一個例子,從一個抽象類:

[TestMethod()] 
    [DeploymentItem("PA Manager.dll")] 
    public void GetNextScheduledTimeTest4() 
    { 
     TimeWheel timeWheel = new TimeWheel(1000, null); 
     AnnouncementSchedule schedule = new AnnouncementSchedule(); 
     schedule.StartDate = DateTime.UtcNow.Date - TimeSpan.FromDays(1); 
     schedule.StartTime = DateTime.Parse("09:00:00"); 
     schedule.EndDate = DateTime.UtcNow.Date; 
     schedule.EndTime = DateTime.Parse("14:30:00"); 
     schedule.Interval = DateTime.MinValue + TimeSpan.Parse("01:00:00"); 
     schedule.DaysValid.ValidDay = new Day[7]; 
     schedule.DaysValid.ValidDay[0] = Day.Monday; 
     schedule.DaysValid.ValidDay[1] = Day.Tuesday; 
     schedule.DaysValid.ValidDay[2] = Day.Wednesday; 
     schedule.DaysValid.ValidDay[3] = Day.Thursday; 
     schedule.DaysValid.ValidDay[4] = Day.Friday; 
     schedule.DaysValid.ValidDay[5] = Day.Saturday; 
     schedule.DaysValid.ValidDay[6] = Day.Sunday; 

     //// test for the next interval time NOT being valid, but the time period and day for the schedule is. 

     PaAnnouncementSchedule paAnnouncementSchedule = new PaAnnouncementSchedule(timeWheel, schedule); 
     PrivateObject param0 = new PrivateObject(paAnnouncementSchedule); 
     PaAnnouncementSchedule_Accessor target = new PaAnnouncementSchedule_Accessor(param0); 
     DateTime currentTime = DateTime.Parse("14:07:00"); 
     DateTime actual; 
     DateTime expected = DateTime.MaxValue; 
     actual = target.GetNextScheduledTime(currentTime); 
     Assert.AreEqual(expected, actual, "Expected time to be DateTime.MaxValue"); 
    } 

的是,很多重要的部分是:

PaAnnouncementSchedule paAnnouncementSchedule = new PaAnnouncementSchedule(timeWheel, schedule); 
PrivateObject param0 = new PrivateObject(paAnnouncementSchedule); 
PaAnnouncementSchedule_Accessor target = new PaAnnouncementSchedule_Accessor(param0); 

這使我可以訪問私有繼承函數「GetScheduledTime」

1

嘗試RhinoMocks。他們可以即時創建派生類(即所謂的部分模擬),您可以在其中調用您的方法。

無論如何,您將需要一個模擬框架來編寫好的單元測試。這裏是some documentation,可以給你一個印象。

+0

剛剛進行了讀取,我將來可能會使用此框架。但在我這樣做之前 - 即對於這個項目,我試圖驗證VS2008沒有我需要的功能。 感謝您的迴應! – 2009-05-19 13:12:04

+0

Rofl現在回顧了這一點(4年後),我看到我應該將你的答案標記爲正確!抱歉。 – 2013-03-13 19:03:50