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

Node.js 在mocha中使用sinon创建请求存根,node.js,mocha.js,sinon,Node.js,Mocha.js,Sinon,我正在使用mocha测试一些类,我需要创建request库的存根 我正在使用sinon,我能够创建请求的存根。get方法,但我无法创建请求的存根(http调用尝试连接到服务器)。正如我所读到的,request.get是request的别名,但是当我存根request.get时,它对request调用没有影响 此代码有效(使用request.get): 在测试中: request = require 'request' describe "User test", -> user = {

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

我正在使用
sinon
,我能够创建
请求的存根。get
方法,但我无法创建
请求的存根(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'

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.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'

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
但这不起作用(尝试连接到提供的url):

在测试中:

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'

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.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'

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
call创建存根的正确方法是什么?哪种方法是存根的

虽然
request
是一个很好的库,但它不是一个结构良好的API的好例子。由于模块
request
被定义为带有附加方法的函数(类似于
express
),据我所知,您无法使用
sinon
为函数
request
创建存根

您可以做的最好的事情是避免在代码中使用
request
函数,而只使用
request.get
request.post
等可以轻松存根的功能


在第二个示例中,为
请求创建存根没有帮助,因为请求不是一种方法,请参阅。

如果有人仍在寻找此问题的答案,您似乎可以使用sinon为请求创建存根:


可以找到更多详细信息

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

有关更多信息,请查看问题答案之一中提到的,node mocks http包提供了一种构建请求和响应模拟的方法。

Bianca-我也看到了该解决方案,但不幸的是,这不是Ander2想要的。你在那里发布的是如何创建request.get的存根,这是Ander2发布的他已经能够做到的。问题是无法模拟“请求”,可以在不指定http方法-请求(选项,回调)的情况下调用该请求;我也有同样的问题。遗憾的是,解决方案似乎是避免使用Request,而是专门使用Request.get,尽管我猜这不是一个很大的变化,或者您可以使用
nock