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

And*_*er2 21 mocha.js node.js 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'
Run Code Online (Sandbox Code Playgroud)

来源:

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
Run Code Online (Sandbox Code Playgroud)

但这不起作用(尝试连接到提供的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'
Run Code Online (Sandbox Code Playgroud)

来源:

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
Run Code Online (Sandbox Code Playgroud)

哪个是为request呼叫创建存根的正确方法?哪个方法要被存根?

ivo*_*szz 25

虽然它request是一个很棒的库,但它不是结构良好的API的好例子.而且,由于模块request被定义为与其他方法(类似于像一个函数express),因为我知道你不能为函数来创建存根requestsinon.

你能做的最好的事情是避免使用request在你的代码的功能和只使用request.get,request.post等等,你可以很容易地存根.

Request在第二个示例中创建存根没有帮助,因为Request不是方法,请参阅源代码.

  • 或者你可以使用`nock`代替 (3认同)

Bia*_*nca 5

如果仍然有人在寻找答案,那么您似乎可以使用sinon创建一个存根来请求:

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

更多细节可以在这里找到