我正在使用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
但这不起作用(尝试连接到提供的网址):
在测试中:
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
电话创建存根的正确方法是什么?哪个方法要被存根?
答案 0 :(得分:25)
虽然request
是一个很棒的库,但它不是结构良好的API的好例子。并且因为模块request
被定义为具有其他方法的函数(类似于express
),正如我所知,您无法使用request
为函数sinon
创建存根。
您可以做的最好的事情是避免在代码中使用request
函数,并且只使用request.get
,request.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()
});
});
答案 3 :(得分:2)
如问题How to mock request and response in nodejs to test middleware/controllers?的一个答案中所述, node-mocks-http 包提供了构建请求和响应模拟的方法。