我找不到任何关于它是否可以做到这一点的信息。
我在抽象类中有几个受保护的方法,想测试它们。
我不想从类继承并测试它的实现(除了技术上不是严格的单元测试,VS2008 也不会让你测试继承的方法)。
我想在集成单元测试的上下文中解决这个问题......我知道例如 nUnit 将允许你这样做。
有什么想法吗?建议?
我找不到任何关于它是否可以做到这一点的信息。
我在抽象类中有几个受保护的方法,想测试它们。
我不想从类继承并测试它的实现(除了技术上不是严格的单元测试,VS2008 也不会让你测试继承的方法)。
我想在集成单元测试的上下文中解决这个问题......我知道例如 nUnit 将允许你这样做。
有什么想法吗?建议?
试试RhinoMocks。他们可以动态创建派生类(所谓的部分模拟),您可以在其中调用您的方法。
无论如何,您都需要一个模拟框架来编写好的单元测试。这里有一些文档,可以给你一个印象。
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”