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

Posted

技术标签:

【中文标题】如何在VS2008中使用集成单元测试来测试抽象类【英文标题】:How to use integrated unit testing in VS2008 to test abstract class 【发布时间】:2010-10-27 07:42:01 【问题描述】:

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

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

我不想从类继承并测试它的实现(除了技术上不是严格的单元测试,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”

【讨论】:

谢谢你,我正在尝试类似的东西......你已经为我很好地清理了语法。【参考方案2】:

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

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

【讨论】:

刚刚看了下,以后可能会用到这个框架。但在我这样做之前 - 即对于这个项目,我试图验证 VS2008 没有我需要的功能。感谢您的回复! Rofl 现在(4 年后)回顾了这一点,我认为我应该将您的答案标记为正确!对不起。

以上是关于如何在VS2008中使用集成单元测试来测试抽象类的主要内容,如果未能解决你的问题,请参考以下文章

从 VS6 移植到 VS2008 时在不寻常的架构中使用单元测试?

使用Xunit来进行单元测试

如何在 Visual Studio 2008 中分析 MsTest 的单元测试?

VS2010单元测试入门实践教程

组件 vs 集成 vs 功能测试

如何使用Spring + EasyMock做Java单元测试