gpt4 book ai didi

javascript - 如何对调用另一个返回 promise 的函数进行单元测试?

转载 作者:数据小太阳 更新时间:2023-10-29 06:00:31 24 4
gpt4 key购买 nike

我有一个使用 express 4 的 node.js 应用程序,这是我的 Controller :

var service = require('./category.service');

module.exports = {
findAll: (request, response) => {
service.findAll().then((categories) => {
response.status(200).send(categories);
}, (error) => {
response.status(error.statusCode || 500).json(error);
});
}
};

它调用我的服务返回一个 promise 。一切正常,但我在尝试对其进行单元测试时遇到了麻烦。

基本上,我想确保根据我的服务返回的内容,我使用正确的状态代码和正文刷新响应。

所以对于 mocha 和 sinon,它看起来像这样:

it('Should call service to find all the categories', (done) => {
// Arrange
var expectedCategories = ['foo', 'bar'];

var findAllStub = sandbox.stub(service, 'findAll');
findAllStub.resolves(expectedCategories);

var response = {
status: () => { return response; },
send: () => {}
};
sandbox.spy(response, 'status');
sandbox.spy(response, 'send');

// Act
controller.findAll({}, response);

// Assert
expect(findAllStub.called).to.be.ok;
expect(findAllStub.callCount).to.equal(1);
expect(response.status).to.be.calledWith(200); // not working
expect(response.send).to.be.called; // not working
done();
});

当我正在测试的函数返回一个 promise 时,我已经测试了类似的场景,因为我可以在 then 中 Hook 我的断言。

我也尝试过用 Promise 包装 controller.findAll 并从 response.send 中解析它,但它也没有用。

最佳答案

您应该将断言部分移动到 res.send 方法中,以确保所有异步任务在断言之前完成:

var response = {
status: () => { return response; },
send: () => {
try {
// Assert
expect(findAllStub.called).to.be.ok;
expect(findAllStub.callCount).to.equal(1);
expect(response.status).to.be.calledWith(200); // not working
// expect(response.send).to.be.called; // not needed anymore
done();
} catch (err) {
done(err);
}
},
};

关于javascript - 如何对调用另一个返回 promise 的函数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39180491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com