2013-10-06 15 views
0

사이트 및 일부 문헌을 검색했지만 명확한 답변을 얻을 수 없습니다. 나는 unittesting을 배워서 새로운 웹 페이지를 만들려고하는데, 단순히 포스트잇을 추가 할 수있는 화이트 보드로 작동한다.단위 테스트 종속 테스트

나는 화이트 보드를 나타내는 Canvas 객체와 그 postboard를 나타내는 티켓 객체를 가지고있다.

this.testRetrieveCanvas = function() 
{ 
    var canvas = getCanvas(); 

    this.assertTrue(canvas != null); 
} 

this.testCanvasType = function() 
{ 
    var canvas = getCanvas(); 

    this.assertTrue(canvas instanceof Canvas);  
} 

this.testIfCanvasIsReused = function() 
{ 
    var canvas = getCanvas(); 

    this.assertEquals(canvas, getCanvas());  
} 

그래서, 내가 세 가지를 테스트 :

  1. 이 방법은 캔버스를 반환합니까 나는이 같은 테스트 유일 캔버스를 검색 할 전역 함수 (지금은) 있나요?
  2. acutal 캔버스입니까?
  3. 이 메서드는 항상 동일한 캔버스를 제공합니까?

지금까지 문제가 없습니다. 그러나 잠시 후에, 나는 "캔버스에 티켓을 추가"테스트 해요 :

this.testAddTicketToCanvas = function() 
{ 
    var ticket = factory.createTicket("yellow"); 
    var canvas = getCanvas(); 

    canvas.addTicket(ticket);  

    this.assertTrue(canvas.contains(ticket)); 
}; 

당신이, 내가 getCanvas 내 테스트 내부() 함수를 사용하고 볼 수 있듯이. 지금이 부양 검사입니까? 이 테스트가 의심없이 돌아가고 싶다면 처음 세 테스트가 통과해야합니다. 의존성이 있다면 어떻게 해결할 수 있습니까?

+0

나머지 코드가 없으면별로 도움이되지 않지만 http://chaijs.com/api/bdd/ (chai), http://sinonjs.org/ (sinon) 또는 http://gofreerange.com/mocha/docs/ (모카)에서 조롱에 대한 소개를 얻을 수 있습니다. –

+0

내 질문에 답할 때 어떤 추가 코드가 필요한지 잘 모르겠습니다. 어쩌면 내가 다시 한번 말하지만 : 단위 테스트의 네 번째 규칙을 만드는 것으로, 여기에있는 단위 테스트 규칙을 위반하고 있습니까? – David

+0

@DavidMaes 추가 정보가 필요합니다. 어떤 테스트 프레임 워크를 사용하고 있습니까? 즉 "assertTrue"메소드를 작성 했습니까 (소스를 포함 할 수 있습니까?) 또는 라이브러리에서이 메소드를 사용하고 있습니까? 또한 "getCanvas()"에 대한 코드를 포함시켜주십시오. 질문에 답변하는데도 필요합니다. –

답변

0

엄밀히 말하면, 캔버스의 미리 구성된 (즉, 원래 생성자가 호출되지 않은) 부분 모크를 반환하려면 getCanvas()를 재정의해야합니다. 캔버스의 생성자가 비어있는 함수이고 getCanvas 메서드에 비즈니스 로직이 포함되어 있지 않은 경우 문제가 발생하지 않습니다.

나는 함께 사용 된 마지막 두 문장에 조심해야합니다. canvas.addTicket(ticket);은 테스트중인 함수이기 때문에 ok입니다. 그런 다음 동일한 객체의 메소드를 사용하여 티켓을 추가했다고 주장합니다. 이 메소드가 아직 구현되어 있지 않은지, false가 돌려 주어 졌는지, 혹은 그보다 나쁜 것이 사실입니까? addTicket 메서드에 티켓을 추가 할 수있는 보조 효과가 있지만 이 예외를 throw하는 플래그를 변경하거나 false 또는 true를 반환하면 어떨까요? contains에 특정 비즈니스 로직이있어서 보내는 티켓에 대해 false를 반환하지만 프로덕션 환경에서 동일한 티켓에 해당하는 경우 (즉, 테스트 티켓이 제대로 초기화되지 않았거나 상태가 누락되거나 제외됨으로 표시되는 경우) 환경의 비즈니스 흐름에서) 현재 논리가 없지만 프로젝트에 2 개월 동안 논리가 변경되어 테스트가 실패하지만 다른 모든 작업 (새 상태가 추가되고이 상태가없는 객체는 존재하지 않는 것으로 간주되는 경우) 클라이언트 a, b 및 c 제외). 나는 계속할 수 있었다.

요점은 특별히 질문에 대답 할 수없는 코드가 없으므로 위와 같은 일반적인 대답과 포인터 만 제공하십시오. 코드를 게시하고 싶지 않은 경우 이러한 모든 시나리오와 고려할 수있는 다른 모든 시나리오를 고려하십시오. 이러한 시나리오에서 코드를 테스트하면 코드를 중단하거나 지금 테스트하지 않을 것입니다. 가까운 미래에, 당신은 괜찮습니다.

+0

사실 getCanvas 메서드를 사용하는 대신 새 Canvas를 만들 수 있습니다. 네가 알아 차리면서 나는 일반적인 대답을 찾고 있었다. 나는 더 많은 코드를 제공하는 것을 완전히 망설이지 만, 목적을 달성하지 못한다. :) addTicket/contains 메서드에 대해서는이 문제에 대한 많은 기사를 읽었습니다. 모든 티켓을 비공개로 유지하는 목록은 비공개이므로 addTicket 메서드를 테스트 할 수 없습니다. 여기 몇 가지 옵션이 있습니다 : - 티켓을 공개합니다 (캔버스가 모든 티켓을 추적 할 수 있어야하기 때문에 좋은 디자인 결정이 아님). - 조합으로 테스트합니다. 긴 응답을 보내 주셔서 감사합니다. – David

0

귀하의 질문에 대한 짧은 대답은 '아니오'입니다. 코드가 rules을 준수하는 한 단위 테스트에 위배되지 않는 경우.

일반적으로 이러한 질문을 통해 테스트의 특정 부분을 조롱하는 것과 관련된 거대한 토론이 있습니다. 귀하의 getCanvas() 함수. 나는이 토론의 배경에는 이유가 있으며 테스트 나 TDD를 계속 진행하기를 원한다면이 주제에 대해 더 깊이 들어가야한다는 것에 동의한다.(Martin Fowler의 우수 article 참조).

그러나 이것이 유효한 단위 테스트인지 질문하는 경우, 단위 테스트 규칙을 준수하는 한 관련이 없다고 생각합니다.

+0

답장을 보내 주셔서 감사합니다.이 주제에 대해 자세히 알고 싶습니다만, 그 중 일부가 이해가 충분하지 않습니다. 1) 테스트 할 대상/테스트하지 않을 내용 2) 비동기 기능 (파일을로드하고 두 가지 이벤트를 전달하는 메소드 (성공 및 실패)) Martin Fowler 기사에 곧 잠깐 들려 줄 것입니다. 대답. – David

+0

s 우연히. 내가 도울 수있어서 기쁘다. –