0

私は TDD の方法で単体テストを練習しようとしているので、多少独立してテストできると思われる一連のインターフェイスを作成しました。成功したかどうかはわかりませんが、モック フレームワークを使用するときが来たと確信できるところまで来ました。私は例から最もよく学び、非常に熟練した誰かがおそらくこれをそれらの1つにすばやく翻訳できると思います(MoqまたはRhino Mocksでしょうか?それらは私が見つけたものです)。

単体テスト:

    [TestMethod]
    public void RendererRendersEachWidgetByCallingBeginRenderThenEndRender()
    {
        // Mocks/Stubs
        ISpace space = new MockSpace();
        IWorld world = new MockWorld();
        IWidget widget1 = new MockWidget("widget1");
        IWidget widget2 = new MockWidget("widget2");
        world.Add(widget1);
        world.Add(widget2);

        // Object under test
        IRenderer target = new Renderer(world, space);
        target.Render();

        // verify BeginRender is called
        Assert.IsTrue((space as MockSpace).results.Contains("Begin Render " + widget1.Id));
        Assert.IsTrue((space as MockSpace).results.Contains("Begin Render " + widget2.Id));

        // verify EndRender is called
        Assert.IsTrue((space as MockSpace).results.Contains("End Render " + widget1.Id));
        Assert.IsTrue((space as MockSpace).results.Contains("End Render " + widget2.Id));

        // verify BeginRender is called before EndRender
        var orderedResults = (space as MockSpace).results.Select((s, i) => Tuple.Create(i, s));
        Assert.IsTrue(
            (orderedResults.Single(x => x.Item2 == "Begin Render " + widget1.Id).Item1) <
            (orderedResults.Single(x => x.Item2 == "End Render " + widget1.Id).Item1));
        Assert.IsTrue(
            (orderedResults.Single(x => x.Item2 == "Begin Render " + widget2.Id).Item1) <
            (orderedResults.Single(x => x.Item2 == "End Render " + widget2.Id).Item1));
    }
4

1 に答える 1

1

これは Rhino.Mocks バージョンです。Rendererの内部が不明だったところを自由に取りました。

ご覧のとおり、かなりの量のセットアップが必要ですが、この場合、すべてのモック オブジェクト タイプを手動で作成する必要はありません。

[TestMethod]
public void RendererRendersEachWidgetByCallingBeginRenderThenEndRender()
{
    // Mocks/Stubs
      var orderedResultList = new List<string>();

    var space = MockRepository.GenerateStub<ISpace>();
      space.Stub(s => s.BeginRender(Arg<IWidget>.Is.Anything))
            .WhenCalled(x => orderedResultList.Add("Begin Render " + ((IWidget)x.Arguments[0]).Id));
      space.Stub(s => s.EndRender(Arg<IWidget>.Is.Anything))
            .WhenCalled(x => orderedResultList.Add("End Render " + ((IWidget)x.Arguments[0]).Id));

    var world = MockRepository.GenerateStub<IWorld>();

    var widget1 = MockRepository.GenerateStub<IWidget>();
      widget1.Stub(w => w.Id).Return("widget1"); // assuming no public setter for this property

    var widget2 = MockRepository.GenerateStub<IWidget>();
      widget2.Stub(w => w.Id).Return("widget2"); // assuming no public setter for this property

    var widgetList = new List<IWidget>{ widget1, widget2 };
      world.Stub(w => w.Widgets).Return(widgetList);

    // Object under test
    IRenderer target = new Renderer(world, space);
    target.Render();

    // verify BeginRender is called
      space.AssertWasCalled(s => s.BeginRender(Arg<IWidget>.Is.Same(widget1)));
      space.AssertWasCalled(s => s.BeginRender(Arg<IWidget>.Is.Same(widget2)));

    // verify EndRender is called
      space.AssertWasCalled(s => s.EndRender(Arg<IWidget>.Is.Same(widget1)));
      space.AssertWasCalled(s => s.EndRender(Arg<IWidget>.Is.Same(widget2)));

    // verify BeginRender is called before EndRender
    var orderedResults = orderedResultList.Select((s, i) => Tuple.Create(i, s));
    Assert.IsTrue(
        (orderedResults.Single(x => x.Item2 == "Begin Render " + widget1.Id).Item1) <
        (orderedResults.Single(x => x.Item2 == "End Render " + widget1.Id).Item1));
    Assert.IsTrue(
        (orderedResults.Single(x => x.Item2 == "Begin Render " + widget2.Id).Item1) <
        (orderedResults.Single(x => x.Item2 == "End Render " + widget2.Id).Item1));
}
于 2012-10-03T03:45:07.473 に答える