【问题标题】:Sinon Spy and Stub function through actual http requestSinon Spy 和 Stub 功能通过实际的 http 请求
【发布时间】:2018-04-11 20:15:56
【问题描述】:

我有一个从 API 调用的函数。如果我在测试中直接调用它,例如 foo.bar(); ,我可以使用 sinon 存根它。但是,如果我通过一个向该函数发出 http 请求的测试来调用它,它就不会被存根。有什么想法吗?

【问题讨论】:

  • 事实证明,我无法监视或存根直接链接到 app.get 的函数。但我可以监视或存根从那里调用的任何子函数。
  • 是的,你可以。我在回答中展示了一种这样做的方法。您可能需要扩展您的问题,以便通过一些实际代码更清楚地了解什么是有效的或无效的。

标签: javascript node.js mocha.js sinon


【解决方案1】:

您需要能够从测试中启动您的应用程序,并且您应该以一种可以注入您想要控制的依赖项的方式来构建您的应用程序。

在下面的代码中,我尝试展示了如何使用链接接缝(使用 proxyquire)来控制依赖项,但您也可以对应用程序使用直接依赖项注入(例如,将其传递给 start() 方法)作为替代方案。

下面的代码具有指导意义,不一定有效,因此它会跳过正确设置 http 侦听器等。这留给读者练习;)

app.js

const myModule = require('./my-module');

if (require.main === module) {
    /// starting from the cli
    start({});
}

module.exports = { 
    start(){
        app.get(`/`, (req, res) => {
            myModule.foo(req.data).then(res.send).catch(res.send);
        });
    });
    stop(){ 
        app.stop(); // somehow kill the http listener and shutdown 
    }
}

test.js

const stub = sinon.stub();
const myApp = proxyquire('../app.js',{'./my-module': {foo: stub } });

before(()=> {
   myApp.start();
});

it('should call a sinon stub', (done) => {
   request('localhost:3000/')
     .then( result = > expect(stub.called).to.equal(true) )
     .then(done, done);  
});

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 2017-05-06
    • 2015-11-26
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多