在mocha中使用sinon创建请求存根

时间:2013-11-18 14:43:17

标签: node.js mocha sinon

我正在使用mocha来测试某些类,我需要创建一个request库的存根。

我正在使用sinon,我可以创建request.get方法的存根,但我无法创建request方法的存根( http调用尝试连接到服务器)。正如我所读到的,request.getrequest的别名,但是当我存根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

但这不起作用(尝试连接到提供的网址):

在测试中:

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电话创建存根的正确方法是什么?哪个方法要被存根?

4 个答案:

答案 0 :(得分:25)

虽然request是一个很棒的库,但它不是结构良好的API的好例子。并且因为模块request被定义为具有其他方法的函数(类似于express),正如我所知,您无法使用request为函数sinon创建存根。

您可以做的最好的事情是避免在代码中使用request函数,并且只使用request.getrequest.post等等,您可以轻松存根。

在第二个示例中为Request创建存根无效,因为请求不是方法,请参阅source code

答案 1 :(得分:4)

如果有人仍然在寻找答案,看起来你可以使用sinon创建一个存根请求:

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

可以找到更多详细信息here

答案 2 :(得分:2)

另一种解决方法是使用 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()
  });  
});

有关详情,请查看this article on Unit Testing with Mocks in Node

答案 3 :(得分:2)

如问题How to mock request and response in nodejs to test middleware/controllers?的一个答案中所述, node-mocks-http 包提供了构建请求和响应模拟的方法。