2014-12-13 4 views
5

죄송합니다. 간단한 질문 인 경우 Node와 Sinon을 처음 사용하는 경우가 많습니다. 나는 중첩 된 비동기 함수가 Nodej에서 호출되었다고 주장하는 방법을 알아 내려고 애 쓰고있다.Sinon - 중첩 된 함수를 스텁하는 방법?

저는 모카 (mocha), 샤이 (sinon) 및 요청 (https://github.com/request/request)을 사용하고 있습니다. 그러나 스터 빙 부분에 뭔가 빠져 있다고 생각합니다. my_app.js 내부

예 - 테스트 내부

var request = require('request'); 

function MyModule() { 
}; 

MyModule.prototype.getTicker = function(callback) { 
    request('http://example.com/api/ticker', function(error, response) { 
     if (error) { 
      callback(error); 
     } else { 
      callback(null, response); 
     } 
    }); 
}; 

exports.mymodule = new MyModule(); 

. 내가 요청하고 일부 더미 데이터를 제공하기 위해 전화를 스텁하려고 노력하고 있습니다. 하지만 내가 줄에 "요청이 정의되지 않은"오류가 점점 계속 "스텁을 만드는거야합니다.

var myApp = require('../my_app.js') 
    ,assert = require("assert") 
    ,chai = require('chai') 
    ,sinon = require('sinon') 
    ,expect = chai.expect; 

describe('mymodule object', function() { 

    var mymodule = myApp.mymodule; 

    before(function(done) { 
     sinon.stub(request).yields(null, JSON.stringify({ 
      price: '100 USD' 
     })); 
     done(); 
    }); 

    it('getTicker function should call request on example ticker', function(done) { 
     mymodule.getTicker(function(error, result){ 
      request.called.should.be.equal(true); 
      done(); 
     }); 
    }); 

}); 

내가 sinon.stub (objname을 할당 할 수 있습니다 알고있다"funcname에 ") 또는 sinon.stub을 ("funcname"),하지만 그 밖에 개체를 설정, getTicker 함수 안에 함수 요청을 스텁하려고 해요.

어쩌면 내가 스파이를 사용해야합니다. (하지만 어떻게?) 위의 getTicker 함수를 테스트하는 더 좋은 방법이 있습니까?

답변

6

request 변수가 알려지지 않았기 때문에 정의되지 않은 메시지가 나타납니다. n 검사 범위. 그러나이 문제를 해결하고 변수에 request 라이브러리를 할당하더라도 스텁을 만들려면 제공된 개체에 대해 메서드가 필요하므로 오류가 계속 발생합니다.

그러한 결과는 request 함수 자체가 객체에 없기 때문에 스터브 될 수 없으며 다른 메소드가 정의 된 함수로 나타납니다. 따라서 테스트 가능성을 지원하려면 코드에서 request을 직접 사용하지 않는 것이 좋으며 대신 첨부 된 메서드를 사용하여 스텁 될 수 있습니다. 예를 들어

my_app.js

MyModule.prototype.getTicker = function(callback) { 
    request.get('http://example.com/api/ticker', function(error, response) { 
    ... 
    }); 
}; 

my_test.js

var request = require('request'); 

before(function() { 
    sinon.stub(request, 'get').yields(null, JSON.stringify({price: '100 USD'})); 
}); 

it('getTicker function should call request on example ticker', function() { 
    mymodule.getTicker(); 
    request.get.called.should.be.equal(true); 
}); 

(스텁 동기 때 비동기 모카 실행으로 해제해야 않는다).

+0

굉장해, 이것에 대해 get 메소드를 사용하지 않았다고 생각하지 않았다. 이제 콜백이 호출 된 것을 확인하기 위해 스파이를 사용할 수도 있습니다. –

+0

Ahh yup 콜백이 호출되었는지 확인할 수 있습니다. 하지만 약간 다른 구문'mymodule.getTicker (callback);''request.get.should.have.been.called; '및'request.get.should.have.been.called;'를 사용하고 있습니다. ! –

관련 문제