在摩卡中用sinon创build请求存根
我正在使用mocha
来testing一些类,我需要创build一个request
库的存根。
我正在使用sinon
,并且能够创buildrequest.get
方法的存根,但是我无法创buildrequest
方法的存根(http调用尝试连接到服务器)。 正如我所读到的, request.get
是request
的别名,但是当我存根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.get
, request.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的文章