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