2009-05-19 4 views
2

zu testen Ich kann keine Informationen darüber finden, ob dies möglich ist.Wie integrierte Unit-Tests in VS2008 verwendet werden, um die abstrakte Klasse

Ich habe ein paar geschützte Methoden innerhalb der abstrakten Klasse und möchte diese testen.

Ich möchte nicht von der Klasse erben und seine Implementierung testen (außer das ist technisch nicht streng Komponententests, auch VS2008 lässt Sie geerbte Methoden nicht testen).

Ich möchte dieses Problem im Zusammenhang mit den integrierten Komponententests lösen ... Ich bin mir bewusst, dass nUnit zum Beispiel ermöglicht Ihnen dies zu tun.

irgendwelche Gedanken? Vorschläge?

Antwort

1

VS2008 kann private und geschützte Methoden testen, die von Basisklassen geerbt wurden, sogar von abstrakten.

Wenn Sie auf diese Weise glücklich sind, klicken Sie mit der rechten Maustaste auf den zu testenden Code und erstellen Sie Komponententests.

Hier ist ein Beispiel für ein Stück Code, das ich eine private, erbte Funktion zu testen verwende, von einer abstrakten Klasse:

[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"); 
    } 

Aus dieser Menge der wichtige Teil:

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

Dies ermöglicht mir den Zugriff auf die private geerbte Funktion "GetScheduledTime"

+0

danke, ich habe etwas Ähnliches versucht ... du hast die Syntax für mich klar gemacht. –

1

Versuchen Sie RhinoMocks. Sie können im Handumdrehen eine abgeleitete Klasse erstellen (einen sogenannten partiellen Schein), in der Sie Ihre Methoden aufrufen können.

Sie benötigen sowieso ein Mock-Framework, um gute Komponententests zu schreiben. Hier ist some documentation, die Ihnen einen Eindruck geben könnte.

+0

Gerade gelesen, werde ich wahrscheinlich dieses Framework in der Zukunft verwenden. Aber bevor ich das tue - für dieses Projekt versuche ich zu überprüfen, dass VS2008 nicht die Funktionalität hat, die ich benötige. Danke für die Antwort! –

+0

Rofl schaute jetzt zurück (4 Jahre später) und ich sehe, dass ich deine Antwort als richtig markieren sollte! Es tut uns leid. –

Verwandte Themen