문제

나는 사용하고있다 mocha 일부 클래스를 테스트하려면 스텁을 만들어야 합니다. request 도서관.

나는 사용하고있다 sinon, 그리고 나는 request.get 방법을 사용했지만 스텁을 만들 수 없습니다. request 방법(http 호출은 서버에 연결을 시도합니다).내가 읽은 대로, request.get 의 별칭입니다 request 하지만 내가 스텁을 할 때 request.get 그 이상은 효과가 없어 request 전화.

이 코드는 작동합니다(사용하여 request.get):

테스트에서:

request = require 'request'

describe "User test", ->
  user = {}
  before (done) ->
    user = new test.user('Ander', 18)    
    sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo')        
    done()
  after (done) ->
    request.get.restore()
    done()
  it "testing server response", ->
    user.getData().should.equal 'ander'

소스에서:

request = require 'request'

class User
  contructor(@name, @age): ->
  getData: ->
    mydata = ''
    request.get 'http://127.0.0.1:8080/', (err, response, body) ->        
      if not err and response.statusCode == 200
        mydata = body
      else
        err = throw new Error "Errorea"
    mydata

그러나 이것은 작동하지 않습니다(제공된 URL에 연결을 시도합니다).

테스트에서:

request = require 'request'

describe "User test", ->
  user = {}
  before (done) ->
    user = new test.user('Ander', 18)    
    sinon.stub(request, 'Request').yields(null, {statusCode: 200}, 'foo')
    #Creating the stub this way, doesn't work neither
    #sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo')
    done()
  after (done) ->
    request.Request.restore()
    done()
  it "testing server response", ->
    user.getData().should.equal 'ander'

소스에서:

request = require 'request'

class User
  contructor(@name, @age): ->
  getData: ->
    mydata = ''
    request 'http://127.0.0.1:8080/', (err, response, body) ->        
      if not err and response.statusCode == 200
        mydata = body
      else
        err = throw new Error "Errorea"
    mydata

스텁을 만드는 올바른 방법은 무엇입니까? request 부르다?스텁을 만드는 방법은 무엇입니까?

도움이 되었습니까?

해결책

하지만 request 훌륭한 라이브러리이지만 잘 구조화된 API의 좋은 예는 아닙니다.그리고 모듈이기 때문에 request 추가 메서드가 있는 함수로 정의됩니다(마찬가지로 express), 내가 아는 바로는 기능에 대한 스텁을 생성할 수 없다는 것입니다. request ~와 함께 sinon.

가장 좋은 방법은 사용을 피하는 것입니다. request 코드에서 작동하고 request.get, request.post, 등을 쉽게 스텁할 수 있습니다.

다음에 대한 스텁 생성 Request 두 번째 예에서는 Request가 메서드가 아니기 때문에 도움이 되지 않습니다. 소스 코드.

다른 팁

누군가가 아직 이에 대한 답변을 찾고 있다면 Sinon을 사용하여 요청을위한 스텁을 만들 수있는 것처럼 보입니다.

before(function(done){
  sinon
    .stub(request, 'get')
    .yields(null, null, JSON.stringify({login: "bulkan"}));
  done();
});
.

자세한 내용은 여기

다른 해결 방법은 sinon 모듈을 사용하여 스텁을 생성하고 해당 모듈에서 proxyquire 를 사용하여 무시할 수 있습니다.

var sinon = require('sinon');
var proxyquire = require('proxyquire');

describe('something', function(){
  var request;
  var overriddenModule;
  before(function(){
    request = sinon.stub();
    // overriding the 'request' dependency with the stub
    overriddenModule = proxyquire('path_to_module_using_request', {'request': request});     
  });
  it("should do something",function(done){
    // stubbing the request(options,callback) method
    request.withArgs(sinon.match.any,sinon.match.any).yields(null,null,responseBody);
    overriddenModule.method_which_is_doing_request;
    // our logic and assertions before calling done()
  });  
});
.

자세한 정보는 노드에서 mocks가있는 단위 테스트에 대한이 문서 / P>

질문 NodeJS에서의 요청 및 응답을 어떻게 조롱하는 방법 미들웨어 / 컨트롤러를 테스트 할 수 있습니까? , 노드 - mocks-http 패키지는 요청 및 응답 모의를 빌드하는 방법을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top