使用chai模拟http请求

时间:2018-08-09 08:51:15

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

我正在测试使用express编写的nodejs应用程序。对于单元测试,我使用chai和sinon。我的API中有以下要测试的路由。

在测试中,我使用以下代码模拟get请求:

 chai.request(app)
            .get('/downloads')
            .send({ wmauth: {
                    _identity: {
                        cn: "username",
                    }
                } })
            .end((err, res) => {
            res.status.should.be.equal(200);
            res.body.should.be.a('object');
            res.body.should.have.property('Items', []);

            AWS.restore('DynamoDB.DocumentClient');
            done();

但是,我总是收到错误消息“无法读取未定义的属性'_identity'”。由于未在请求中发送对象“ wmauth”,因此未定义。我试图使用send方法尝试将其包括在请求中,但是没有运气。我想我需要以某种方式模拟它并将其发送到请求中,但不知道如何执行。有人可以帮我吗? 下面的方法进行测试:

 app.get('/downloads', async (req, res) => {
    const created_by_cn = req.wmauth['_identity'].cn;
    if(!created_by_cn) {
        return res.status(400).json({
            error: 'Mandatory parameters: created_by_cn',
        });
    }
    try {
        const data = await downloadService.getDownloads(created_by_cn);
        return res.status(200).json(data);
    }
    catch(error){
        res.status(500).json({error: error.message});
    }
});

谢谢

2 个答案:

答案 0 :(得分:0)

我想您忘记了使用req.body,如:

const created_by_cn = req.body.wmauth['_identity'].cn;

希望可以解决您的问题

答案 1 :(得分:0)

由于chai-http使用superagent,因此根据其doc,您需要使用query()才能在get请求中传递查询参数:< / p>

chai.request(app)
            .get('/downloads')
            .query({ wmauth: {_identity: {cn: "username"}}})
            .end((err, res) => { ... });

然后在express路由中,您可以在req.query中找到参数:

app.get('/downloads', function (req, res) {  
  const created_by_cn = req.query.wmauth._identity.cn;
  ...
})