【问题标题】:How to use Chai-HTTP with Sinon?如何将 Chai-HTTP 与 Sinon 一起使用?
【发布时间】:2017-10-24 05:47:48
【问题描述】:

这是我要测试的路线:

app.post('/api/user', (req, res) => {

        dbService.replaceUserOnDuplicate(req.body, function returnResponse(insertedId) {
            if (insertedId === 0 || insertedId === req.body.id) {
                return res.sendStatus(200);                            
            }
            // TODO_MINH: Send an appropriate error to handle by the front-end
            return res.send({});
        });
    });

我可以使用 chai-http 来做这样的事情(伪代码):

it('test', function (done) {
            chai.request(server)
                .post('/api/user')
                .send({ user: SomeUserObject })
                .end(function (err, res) {
                    res.should.have.status(200);
                    done();
                });

        });

但是,api/users 路由会进行数据库调用。我将如何使用 sinon 来存根此方法(replaceUserOnDuplicate),以便它返回一个虚拟响应(如 0 或任何东西)?

有可能吗?我正在查看 Chai-HTTP 语法,发现没有空间插入任何 Sinon 存根方法。

作为参考,这里是 dbService (mySQL node.js):

replaceUserOnDuplicate: function(user, callback) {
        this.tryConnect().getConnection(function(err, con) {
            var sql = queries.ReplaceUserOnDuplicate;
            // Insert parameters
            con.query(sql, [user.id, user.googleID, user.gender, user.firstName, user.lastName, user.email, user.isProfileSetUp, user.location, user.phoneNumber,
                 // On Duplicate Key Update parameters
                 user.googleID, user.gender, user.firstName, user.lastName, user.email, user.isProfileSetUp, user.location, user.phoneNumber], 
                 function (err, result) {
                con.release();
                if (err) throw err;
                return callback(result.insertId);
            });
        });
    },

感谢您的帮助!

【问题讨论】:

  • 什么是数据库?它有一个可以注入的模拟吗?
  • 在原帖中添加了相关的数据库调用。我的问题是,即使我可以模拟它,在语法上看起来如何?如何注射?
  • 所以,我目前正在解决同样的问题。您发布的解决方案是您最终采用的解决方案吗?

标签: node.js unit-testing sinon chai chai-http


【解决方案1】:

一个潜在的解决方案:如果我使用中间件将 req.db 的属性设置为我们的 dbService 对象,那么我可以在 chai-http 中依赖注入 dbService 的调用...通过使用 .send() 向它们发送参数。我相信 .send() 可以被链接。

这有效吗?

示例(中间件):

var exposeDb = function(req, resp, next){
    req.dbService= dbService;
    next();
  };

  app.use('/api/user', exposeDb, next);

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2018-08-09
    • 2020-10-11
    • 1970-01-01
    • 2014-06-09
    • 2019-01-11
    • 2017-10-08
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多