如何测试 Chai 中函数的回调?
How to test callback of function in Chai?
我正在使用 Slack API,我想测试它是否可以正常使用响应状态代码。这是发送函数:
sendMsg(msg) {
return this.slack.webhook({text: msg}, (err, res) => {
if (err) {
throw err;
}
console.log(res.statusCode) // = 200
return res.statusCode;
});
}
我的测试:
it('Checks connection with Slack', (() => {
let slack = new Slack();
let res = slack.sendMsg('test');
expect(res).to.equal(200);
}));
但是当然。它给了我松弛的请求对象。我想等待来自 slack API 的响应对象。提前致谢。
看起来 slack.webhook
接收回调,这就是您检索状态的方式。问题是 sendMsg
的调用者无法获得该状态。
解决此问题的一种方法是让 sendMsg
接受回调:
sendMsg(msg, onStatusReceived) {
this.slack.webhook({text: msg}, (err, res) => {
if (err) {
throw err;
}
console.log(res.statusCode) // = 200
onStatusReceived(res.statusCode);
});
}
然后在您的测试中,使用 done
在调用回调时结束测试:
it('Checks connection with Slack', (done) => {
let slack = new Slack();
slack.sendMsg('message', status => {
expect(status).to.equal(200);
done();
});
});
另一种方法是让 sendMsg
将 slack.webhook
包装在一个承诺中,这样调用者就可以 sendMsg().then(...)
.
我处理返回回调以进行测试的方法之一如下:
it('receives successful response', async () => {
nock('https://localhost')
.persist()
.log(console.log)
.post(‘/getData’, (unitData, callback) => {
return true;
})
.delayBody(1000)
.reply(200, {statusCode: 'Some Status'});
const getSomeData = await getResponse(unitData, function callBack(unitData, error, data){
expect(data.statusCode).to.be.equal(200);
}) })
getResponse 函数(返回回调):
getResponse(unitData, function callBack(unitData, error, data){
try {
return request.post(unitData, function (err, resp) {
if (!err && resp.statusCode === 200) {
if (resp.body.error) {
return callback(obj, JSON.stringify(resp.body.error), null);
}
return callback(obj, null, resp);
} else {
if (err == null) {
err = { statusCode: resp.statusCode, error: 'Error occured.' };
}
return callback(obj, err, null);
}
});
} catch (err) {
return callback(obj, err, null);
}
}
我正在使用 Slack API,我想测试它是否可以正常使用响应状态代码。这是发送函数:
sendMsg(msg) {
return this.slack.webhook({text: msg}, (err, res) => {
if (err) {
throw err;
}
console.log(res.statusCode) // = 200
return res.statusCode;
});
}
我的测试:
it('Checks connection with Slack', (() => {
let slack = new Slack();
let res = slack.sendMsg('test');
expect(res).to.equal(200);
}));
但是当然。它给了我松弛的请求对象。我想等待来自 slack API 的响应对象。提前致谢。
看起来 slack.webhook
接收回调,这就是您检索状态的方式。问题是 sendMsg
的调用者无法获得该状态。
解决此问题的一种方法是让 sendMsg
接受回调:
sendMsg(msg, onStatusReceived) {
this.slack.webhook({text: msg}, (err, res) => {
if (err) {
throw err;
}
console.log(res.statusCode) // = 200
onStatusReceived(res.statusCode);
});
}
然后在您的测试中,使用 done
在调用回调时结束测试:
it('Checks connection with Slack', (done) => {
let slack = new Slack();
slack.sendMsg('message', status => {
expect(status).to.equal(200);
done();
});
});
另一种方法是让 sendMsg
将 slack.webhook
包装在一个承诺中,这样调用者就可以 sendMsg().then(...)
.
我处理返回回调以进行测试的方法之一如下:
it('receives successful response', async () => {
nock('https://localhost')
.persist()
.log(console.log)
.post(‘/getData’, (unitData, callback) => {
return true;
})
.delayBody(1000)
.reply(200, {statusCode: 'Some Status'});
const getSomeData = await getResponse(unitData, function callBack(unitData, error, data){
expect(data.statusCode).to.be.equal(200);
}) })
getResponse 函数(返回回调):
getResponse(unitData, function callBack(unitData, error, data){
try {
return request.post(unitData, function (err, resp) {
if (!err && resp.statusCode === 200) {
if (resp.body.error) {
return callback(obj, JSON.stringify(resp.body.error), null);
}
return callback(obj, null, resp);
} else {
if (err == null) {
err = { statusCode: resp.statusCode, error: 'Error occured.' };
}
return callback(obj, err, null);
}
});
} catch (err) {
return callback(obj, err, null);
}
}