2

これができるかどうかについての情報は見つかりません。

抽象クラス内にいくつかの保護されたメソッドがあり、これらをテストしたいと考えています。

クラスから継承してその実装をテストしたくありません(技術的に厳密には単体テストではないことに加えて、VS2008では継承されたメソッドをテストできません)。

統合単体テストのコンテキスト内でこの問題を解決したいと思います...たとえば、nUnitでこれが可能になることは承知しています。

何かご意見は?提案?

4

2 に答える 2

1

RhinoMocksを試してみてください。メソッドを呼び出すことができる派生クラス (いわゆる部分モック) をオンザフライで作成できます。

いずれにせよ、優れた単体テストを作成するには、モック フレームワークが必要です。これは、印象を与える可能性のあるいくつかのドキュメントです。

于 2009-05-19T12:47:03.600 に答える
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」にアクセスできます

于 2009-05-27T16:53:38.947 に答える