Как использовать интегрированное модульное тестирование в VS2008 для тестирования абстрактного класса

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

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

Я не хочу наследовать от класса и проверять его реализацию (кроме того, это технически не строго модульное тестирование, также 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. Они могут создавать производный класс "на лету" (так называемый частичный макет), где вы можете вызвать свои методы.

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