2012-10-03 4 views
0

TDD 방식으로 단위 테스트를 연습하려고하므로 다소 독립적으로 테스트 할 수있는 인터페이스 집합을 만들었습니다. 나는 성공했는지 확신 할 수 없지만 지금은 조롱하는 프레임 워크를위한 시간이라고 확신한다. 나는 예제를 통해 가장 잘 배우며, 매우 능숙한 사람을 신속하게 그 중 한 명으로 번역 할 수있을 것이라고 생각합니다 (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)); 
    } 
+0

무엇이 질문입니까? –

답변

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)); 
} 
+0

도움을 주셔서 감사합니다! –

관련 문제