2013-12-21 1 views
1

단위 테스트를 수행하는 데 jasmine-node를 사용하고 있습니다. 내가 Date.now을 조롱하는 코드 아래에 한() Date.now()의 스파이가 재스민 노드가 응답하지 않음

spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time 

은 그 때 나는 jasmine-node spec/를 실행하려고하지만 아무 출력 작업을 중단했다. 나는 이유가 무엇인지 알 수 없었다.

답변

4

나는 작은 시험을 보았습니다. 그것은 잘 작동합니다. 버전 1.11.0에서 jasmin-node 사용.

그때 사용한 Date.now 함수는 어디에 있습니까?

spyOn(Date, 'now').andReturn(1387636363717); 
expect(Date.now()).toEqual(1387636363717); 
+0

내 코드는 내 코드와 정확히 같습니다. 내 재스민 노드 버전은 1.12.0 – Shuping

+0

나는 또한 재스민 노드 1.11.0 같은 문제를 시도했다. OS는 Ubuntu 12입니다. 왜 Date.now에서 스파이를하면 jasmine-node가 작동하지 않는지 알 수 없습니다. – Shuping

0

문제는 시간의 경과를 표시하는 Date.now() 호출 노드 런타임 (timers.js) 코드가 있다는 것이다. 타이머 (setTimeout)를 설정하고 그 코드가 jasmine.Clock을 사용하지 않는 동안 실행되는 코드를 가지고 있다면 node.js가 다음 번에 timeout을 실행하기 전에 어느 정도 시간이 경과 할 때까지 기다릴 수 있습니다. 이 코드는 외부 자바 스크립트 토지에서 호출 된 것으로 보이므로 자바 스크립트의 단일 스레드 속성에 을 의존 할 수 없습니다. Date.now 스파이의 .andCallFake에 중단 점을 넣음으로써 스펙의 실행이 밀리 초를 기다리는 동안 무기한 중단되는 것을 알 수있었습니다.

우리가 매우 큰 단위 테스트 스위트를 가지고 있으며 setTimeout이 다른 호출의 부작용으로 호출되고 jasmine.Clock이 모든 사양에서 보편적으로 사용되지 않을 가능성이 있기 때문에 이는 나에게 문제가됩니다. 이것은 최적화의 부작용이므로 (주석에 '너무 많은 오버 헤드'가 있음), node.js의 버그라고 생각합니다.

당신은 당신의 테스트 시간을 중지하려면 : Date.now에

  1. 스파이 귀하의 사양 함수 내에서 (it 기능 -하지 beforeEach을). 그렇게하면 스펙이 지연되지 않습니다 (왜 @ marco.jantke가이 문제를 보지 못했는지 설명합니다).
  2. 테스트중인 코드에서 타이머를 사용하는 경우 jasmine.Clock을 사용하십시오.