【发布时间】:2018-11-10 17:23:46
【问题描述】:
我有一个简单的 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,我可以看到记录器被调用,但它被调用了两次。我想我错过了一些简单的东西。谁能指出我正确的方向?
【问题讨论】:
标签: javascript asynchronous promise mocking jestjs