2

내 단위 테스트가 어떤 이유로 든 then 함수를 실행하지 않습니다. 다음은 테스트 코드입니다. 나는 '바벨 - polyfill'를 사용하려고했습니다Promise. 그럼 Karma + Jasmine + PhantomJs를 사용할 때 트리거하지 않습니까?

describe("Basic promise test",() => { 
    it("should trigger .then function",() => { 
     var mock = jasmine.createSpy('some method'); 
     var promise = new Promise((resolve, reject)=> { 
      console.log("inside Promise"); 
      resolve('something'); 
      console.log("done!"); 
     }); 
     promise.then(mock);   
     promise.then(function() { //neither works! 
      mock(); 
      console.log("resolved"); //code does reach here but only after test fails 
     }); 

     expect(mock).toHaveBeenCalled(); 
    }); 
}); 

, 아무 소용이 'ES6-약속'과 '약속 - polyfill'. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이것에 대한

Jsfiddle는 : https://jsfiddle.net/L53zxe39/

+0

약속은 * 비동기 적으로 * 해결되므로 재스민의 비동기 테스트 기능을 사용해야합니다. [이 기사] (http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=Pr4UoAyeYCM) 및 [this SO 대답] (http://stackoverflow.com/a/16401978/157247),'runs'와'waitsFor'를 사용합니다. 나는 대답으로 게시 할 것이지만 재스민에 대해서는 아무 것도 모른다. 아마도 '실행'과 '기다리는 것'보다 약속 테스트에 더 구체적인 것이있을 것이다. –

+0

@ T.J.Crowder 여기 jsfiddle : https://jsfiddle.net/L53zxe39/를 참조하십시오. 나는 이미'waitsFor'를 사용해 보았지만 Jasmine 2.0을 사용하고 있기 때문에 오류가 발생합니다 (제거했다고 생각합니다). – supersan

+0

그래, 그 이유는 대답을 게시하지 않았기 때문에 jasmine을 모른다는 것입니다. , 기사의 나이를 말할 수 없었고, 내가 찾은 대답은 2013 년부터였습니다. 근본적으로 문제는 해상도가 비동기이므로 재스민은이를 알아야합니다. 자스민 문서에서 약속 기반 API를 테스트하는 현재 방법을 살펴보십시오. –

답변

6

약속은 해결되지만, then 콜백은 체크 expect(mock).toHaveBeenCalled();이 이루어진 후, 다음 microtask에 호출된다.

이것은 의도 된 동작이며 약속을 모호하게하지 않도록 설계되었습니다. .then 콜백은 약속이 이미 해결 되었더라도 나중에 호출되도록 보장됩니다.

비동기 자스민 테스트는 다음과 같은 방식으로 작동 : 당신은 명시 적으로 스펙을 실패 done.fail을 사용할 수 있습니다

describe("Basic promise test",() => { 
    it("should trigger .then function", (done) => { 
     var mock = jasmine.createSpy('some method'); 
     var promise = new Promise((resolve, reject)=> { 
      console.log("inside Promise"); 
      resolve('something'); 
      console.log("done!"); 
     }); 
     promise.then(mock).then(() => { 
      expect(mock).toHaveBeenCalled(); 
      done(); 
     }).catch(e => { 
      done.fail(e); 
     }); 
    }); 
}); 

. 이는 테스트 중에 잡히지 않은 예외에 대해 jasmine을 포착하고 알리는 데 필요합니다.

+0

답변 주셔서 감사합니다. 그것은 완벽하게 작동합니다! – supersan

관련 문제