2017-05-14 17 views
1

약속이 해결 된 후 실행되는 일부 코드가 있습니다. 약속 된 해상도로 호출되어야하는 메소드를 간첩하려고하지만 메소드에 대해 간첩 호출이 호출되기 전에 실행을 완료하는 테스트에 문제가 있습니다.Sinon을 사용하여 약속 해결 후 테스트

실제로 storage.add에 대한 호출을 테스트 할 수 있습니까?

_execute: function() { 
    this.updateServiceApi().then(function(){ 
     // tests finish before this code is executed :(
     storage.add("name", true); 
    }); 
}, 
+0

어떤 테스트 러너를 사용하고 있습니까? –

답변

0

여기서 문제가 _execute 동기 인 것처럼 당신이 당신의 테스트를 작성한 것입니다 :

여기 테스트입니다 :

"it marks true in storage": function() { 
    sinonSandbox.stub(tested, "updateServiceApi", function() { 
     return MPromise.resolve(); 
    }); 

    var storageStub = sinonSandbox.stub(storage, "add"); 

    tested._execute(); 

    expect(
     storageStub.calledWith("name", true) 
    ).to.be.true 
} 

그리고 여기에 구현입니다.

약속 때문에 storage.add() 전화가 걸리기 전에 expect 호출이 실행됩니다.

정확하게이 문제를 처리하는 방법은 테스트 러너에 따라 다르지만 일반적인 수정은 expect 코드가 포함될 테스트에서 호출 된 함수에 .then()을 추가하는 것입니다.

"it marks true in storage": function() { 
    sinonSandbox.stub(tested, "updateServiceApi", function() { 
     return MPromise.resolve(); 
    }); 

    var storageStub = sinonSandbox.stub(storage, "add"); 

    return tested._execute() 
     .then(() => { 
      expect(storageStub.calledWith("name", true)).to.be.true; 
     }); 
}