在摩卡中用sinon创build请求存根

我正在使用mocha来testing一些类,我需要创build一个request库的存根。

我正在使用sinon ,并且能够创buildrequest.get方法的存根,但是我无法创buildrequest方法的存根(http调用尝试连接到服务器)。 正如我所读到的, request.getrequest的别名,但是当我存根request.get它对request调用没有任何影响。

此代码工作(使用request.get ):

在testing中:

 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 

但是这不起作用(试图连接到提供的url):

在testing中:

 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 

哪个是创buildrequest调用的存根的正确方法? 哪个方法被存根?

虽然request是一个很好的库,但它不是一个结构良好的API的好例子。 而且因为模块request被定义为一个带有附加方法的函数(类似于express ),所以我知道你不能用sinon为函数request创buildstub。

你可以做的最好的事情就是避免在你的代码中使用request函数,并且只使用request.getrequest.post等等,你可以很容易地使用stub。

在第二个示例中为Request创build存根无助,因为请求不是方法,请参阅源代码 。

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

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

更多细节可以在这里find

正如在问题的答案之一中提到的那样, 如何在nodejs中模拟请求和响应来testing中间件/控制器? , node-mocks-http软件包提供了一种构build请求和响应模拟的方法。

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

欲了解更多信息,请查看这篇关于在Mock in Node中进行unit testing的文章