2017-10-05 21 views
0

나는 어떻게 든 해결할 수없는 혼동하지 않는 작동 테스트를 가지고 있습니다. (자바 배경에서오고 있습니다. 그래서 제 용어에 약간의 실수가있을 경우 미리 유감입니다.) .약속의 다른 메서드가 호출 된 경우 Sinon 확인

foo()bar()과 같은 일부 공개 기능을 가진 객체 클래스 Trigger이 있습니다. 논리는 다음과 같습니다

하나는 다른 개체에 직접 foo()를 호출 할 수 있습니다, 또는 bar()이 (AN 배열로)를 호출하는 경우, 다음 Trigger.bar()Trigger.foo()사항 Array.length에게 번 호출합니다.

트리거는 블루 버드 약속으로 구현됩니다. 이 트리거의 기본 발췌이다 (나는 종류의 중복 것이와 함께, 몇 가지 논리를 삭제하지만, 훨씬 더 현실에 존재 일) : 그래서

// Will be refactored afterwards 
var self; 

var Trigger = function() { 
    self = this; 
}; 

Trigger.prototype.bar = function bar(members) { 
    return new Promise(function (resolve, reject) { 
    Promise.map(members, function (member) { 
    self.foo(member) 
    .then(function(res){ 
     ... 
    }) 
    // catch 
    }); 
    }); 
}; 

Trigger.prototype.foo = function foo(member) { 
    return new Promise(function(resolve, reject){ 
    doSomethingWithMember(member) 
    .then(function(res){ 
     ... 
    }) 
    // catch 
    }); 
} 

하나를 볼 수 있습니다, 각 구성원 bar() 전화 foo() members 배열에 있습니다.

나는 트리거 객체을 스파이 검사하고 foo()을 n 번 호출했는지 확인하고 싶습니다. 나는 현재이도 불려 갔을 경우 그냥 확인하고 위치를 (변경된 기능 이름으로) 한 그래서

:

var chai = require('chai'); 
var expect = chai.expect; 
var sinon = require('sinon'); 
var sinonChai = require('sinon-chai'); 

chai.use(require('chai-as-promised')); 
chai.use(sinonChai); 

var Trigger = require(...); 
var trigger = new Trigger(); 

     ... 

    describe("bla", function() { 
    it("should invoke 'foo()' n times", function() { 
     var spy = sinon.spy(trigger.foo); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member); 
     return expect(spy).to.have.been.called; // does not pass 
    }) 
    }); 

이 분명히 트리거의 약속으로 인해 작동하지 않는, 따라서 나에게 말한다 :

AssertionError: expected foo to have been called at least once, but it was never called

하지만 다음 에서이 문제를 해결하려고 아무리() bar() 블록은 항상 내 스파이가 호출되지 않았 음을 주장하고있다.

describe("bla", function() { 
    it("should invoke 'foo()' n times", function() { 
     var spy = sinon.spy(trigger.foo); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member) 
     .then(function(){ 
      return expect(spy).to.have.been.called; // does not pass with the same AssertionError (has not been invoked) 
     }); 
    }) 

는 좀 로깅을 수행하고 foo()가 호출 확신했다. 내가 뭘 잘못하고 있는지 생각해?

감사합니다, 내 (바보!) 실수를 발견

답변

0

vegaaaa. API를 잘못 읽었습니다 ...(내가 더 이해할 발견하기 때문에) 또는

describe("bla", function() { 
    it("should invoke 'foo()'", function() { 
    var spy = sinon.spy(trigger, "foo"); 
    var member = MemberBuilder.buildCorrect(); 
    trigger.bar(member) 
    .then(function(res) { 
     return expect(spy).to.have.been.called; 
    }) 
    }) 

:

var spy = sinon.spy(trigger.foo);

var spy = sinon.spy(trigger, "foo");

를가되어야 그래서이 마법처럼 작동

describe("bla", function() { 
    it("should invoke 'foo()'", function() { 
     sinon.spy(trigger, "foo"); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member) 
     .then(function() { 
     return expect(trigger.foo).to.have.been.called; 
     }) 
    }) 

희망이 있으면 다른 사람들이 api에서 같은 문제를 겪을 수 있습니다.