我有一个简单的js函数,该函数尝试通过Promise连接到mongodb,要么成功要么失败。
const MongodbService = () => {
mongoose.connect(mongodbUrl, options).then(() => {
logger.info('Mongodb Connected', { url: process.env.MONGODB_URL })
}).catch(err => {
logger.error('Mongodb: ${err}', { url: process.env.MONGODB_URL })
})
return mongoose
}
,我想简单地测试一下。我嘲笑记录器:
import logger from '../../../config/winston'
jest.mock('../../../config/winston')
我有测试成功的规范,该规范可以正常工作:
it('it should handle a connection success', async () => {
mongoose.connect = jest.fn(() => Promise.resolve())
await MongodbService()
expect(logger.info.mock.calls[0][0]).toEqual('Mongodb Connected')
expect(logger.info.mock.calls[0][1]).toEqual({ url: 'mongodb://mongodb/jb-dev' })
})
我还有另一个检查失败的地方,这就是我遇到的问题:
it('it should handle a connection failure', async () => {
mongoose.connect = jest.fn(() => Promise.reject(new Error('boom')))
await MongodbService()
expect(logger.error.mock.calls[0][0]).toEqual('Mongodb Error: boom')
})
这无法说明未调用记录器,即使我将console.log放在函数中也可以正确调用它。如果我在期望值附近添加setTimeout,则可以看到记录器正在被调用,但是它被调用了两次。我想我缺少一些简单的东西。谁能指出我正确的方向?
答案 0 :(得分:0)
Do!因此,我很想不到我以为它不起作用时返回的信息。添加nextTick对我来说很好:
it('it should handle a connection failure', async () => {
mongoose.connect = jest.fn(() => Promise.reject(new Error('bang')))
await MongodbService()
process.nextTick(() => {
expect(logger.error.mock.calls[0][0]).toEqual('Mongodb: Error: bang')
})
})