Как использовать интегрированное модульное тестирование в VS2008 для тестирования абстрактного класса - PullRequest
2 голосов
/ 19 мая 2009

Я не могу найти информацию о том, может ли он это сделать.

У меня есть пара защищенных методов внутри абстрактного класса, и я хочу их протестировать.

Я не хочу наследовать от класса и тестировать его реализацию (кроме того, что технически это не строго модульное тестирование, VS2008 также не позволяет тестировать унаследованные методы).

Я бы хотел решить эту проблему в контексте интегрированных модульных тестов ... Я знаю, что, например, nUnit позволит вам сделать это.

есть мысли? предложения?

Ответы [ 2 ]

1 голос
/ 27 мая 2009

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 голос
/ 19 мая 2009

Попробуйте RhinoMocks . Они могут создавать производный класс на лету (так называемый частичный макет), где вы можете вызывать ваши методы.

Вам все равно понадобится фиктивная среда для написания хороших модульных тестов. Вот некоторая документация , которая может дать вам впечатление.

...