模拟内部依赖性

时间:2019-06-25 04:15:05

标签: node.js mocha sinon

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

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

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);
        }        
    });
});

1 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题,并深入研究了fbgraph源代码我found out,即使它使用的是“ 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,因此请确保使用与{{ 3}}方法