mocha에서 sinon을 사용하여 요청 스텁 만들기
문제
나는 사용하고있다 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 패키지는 요청 및 응답 모의를 빌드하는 방법을 제공합니다.