代码之家  ›  专栏  ›  技术社区  ›  John Nicholas

如何在VS2008中使用集成单元测试来测试抽象类

  •  2
  • John Nicholas  · 技术社区  · 17 年前

    我找不到任何关于它是否能做到这一点的信息。

    我在抽象类中有几个受保护的方法,我想测试它们。

    我不想从类继承并测试其实现(除此之外,从技术上讲,这不是严格的单元测试,VS2008也不允许您测试继承的方法)。

    我想在集成单元测试的上下文中解决这个问题。。。例如,我知道nUnit将允许您这样做。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Stefan Steinegger    17 年前

    RhinoMocks . 他们可以动态创建派生类(所谓的部分模拟),您可以在其中调用方法。

    无论如何,您都需要一个模拟框架来编写好的单元测试。这是 some documentation ,这会给你一个印象。

        2
  •  1
  •   ChrisBD    17 年前

    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);