【问题标题】:Mock internal dependency模拟内部依赖
【发布时间】:2019-06-25 04:15:05
【问题描述】:

我有一个对 Facebook 图形对象具有内部依赖关系的请求,该对象对 FB 图形 API 执行另一个请求。

我想知道是否可以使用 sinon 来模拟图形对象,以便它实际上不会在测试中执行请求,而是会使用我在测试中提供的值执行回调函数。

server.post("/facebookLogin", function(req, res) {
    graph.setAccessToken(req.body.fbtoken);

    graph.get("me?fields=email", function(err, obj) {
        if (!err) {
            var email = obj.email;

            checkUserAlreadyRegistered(email, function(user) {
                if (user) {
                    return res.send(200, {user:user, token: decorateToken(user.id)});
                } else {
                    return res.send(404);
                }            
            });
        } else {
            return res.send(500);
        }        
    });
});

【问题讨论】:

    标签: node.js mocha.js sinon


    【解决方案1】:

    我遇到了完全相同的问题,并深入研究了我 found out 的 fbgraph 源代码,即使它使用“graphql”,内部也是 request 的网络请求,因此您可以使用 nock 轻松拦截它:

    
    // https://github.com/criso/fbgraph/blob/master/lib/graph.js#L34 <-- fb graph url
    
    const fbMock = nock('https://graph.facebook.com/v4.0/')
     .get('/me')
     .query(true)
     .reply(200, {
       id: '123123',
       name: 'fb username',
       email: 'user@fb.com'
     })
    
    it('should not call fb"', (done) => {
    
      chai.request(server)
       .post('/facebookLogin')
       .send({ fbtoken: 'token_fb' })
       .end((err, res) => {
         expect(err).to.be.null
         expect(res).to.have.status(200)
         expect(fbMock).to.have.been.requested
         done()
       })
    }
    

    注意:/v4.0/ 部分可能会因您的配置而异,但默认值为 2.9,因此请务必使用与 setVersion 方法设置的相同的部分 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      相关资源
      最近更新 更多