【问题标题】:Use sinon stub for request constructor对请求构造函数使用 sinon 存根
【发布时间】:2016-04-22 06:44:15
【问题描述】:

我已经实现了节点 js 代码来调用 HTTP API 的使用请求模块。 对于get、post、put、delete,我直接调用了require模块的request(),

var sendRequest = function(req, callback) {
    request(req, function(err, res) {
        if (err) {
            callback(err, null, res);
        } else {
            callback(null, res);
        }
    }
}

我想调用 sendRequest() 但模拟 request() 的响应。 对此的任何指针。

【问题讨论】:

  • 你可以像这里描述的那样使用 sinon -> stackoverflow.com/questions/20050507/…
  • 我浏览了链接,但在这种情况下,我们将不得不编写独立的 get()、put() 等。正如您可以在上面查看的那样,我已经在 request() 上实现了所有方法类型。我需要模拟那个特殊的 request()。
  • @PriyankaWare 你找到答案了吗?

标签: node.js sinon


【解决方案1】:

除了 sinon 之外没有其他任何东西的一种方法是对 Request 的内部类进行 stub,它可以方便地提供它的原型,就像这样

stub = sinon.stub(request.Request.prototype, "init");
stub.callsFake( options => options.callback(null, {statusCode: 200}, "faked response"));

其中callsFake中的optionsrequest函数处理并传入Request.prototype.init

现在您的回调参数是 var sendRequest = function(req, callback) {...} 函数中预期的参数

【讨论】:

    【解决方案2】:

    众多选项之一是使用proxyquire 存根请求模块:

    var proxyquire = require('proxyquire')
      , assert = require('assert')
      , requestStub = function (req, callback) { callback(req); };
    
    // assuming you export the sendRequest from that file
    var sendRequest = proxyquire('./sendRequest', { 'request': pathStub });
    
    describe('sendRequest', function() {
        it('request', function (done) {
            var someReq = {a: 'b'};
            sendRequest(someReq, function (req) {
                assert.equal(someReq, req);
                done();
            });
        });
    });
    

    【讨论】:

    • 感谢您的回复,但我观察到要使其正常工作,我必须导出 sendRequest()。就我而言,sendRequest 是原型方法,我无法导出它。
    • @PriyankaWare 随时欢迎您。导出函数会造成多大的危害?你能把它移到一个单独的私人文件吗?
    • 它肯定不会造成任何伤害。但这就是我们将所有方法定义为原型方法所遵循的方法。如果这是我可以进行该更改的唯一选择,否则如果我们为此找到一些替代方案将会很棒。
    • @PriyankaWare 的“原型方法”是指附加到类 JS 类函数的方法?
    • 是的。在我的 JS 文件中,我正在创建 DataSource 并为其附加一些原型方法,在我的测试文件中,我正在创建需要该 JS 文件和调用原型方法的新数据源。
    猜你喜欢
    • 2016-09-17
    • 2015-06-04
    • 2016-03-31
    • 2020-11-24
    • 2018-06-18
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多