【发布时间】:2021-10-11 11:58:16
【问题描述】:
我对使用 mongodb-memory-server 和 jest 进行单元测试感到非常困惑。我设置了内存服务器github - @shelf/jest-mongodb。我正在使用 mongodb 的节点驱动程序,并且我有一个 DataAccessObject 类:
const chalk = require('chalk')
const ObjectId = require('bson')
let orders
module.exports = class OrdersDAO {
static async injectDB(clientConnection) {
if (orders) {
return
}
try {
orders = await clientConnection
.db(process.env.DATABASE)
.collection('orders')
console.log(
chalk.magentaBright(
'OrdersDAO.injectDB() ~~~ line 16 ordersDAO injected DB with client connection....'
)
)
} catch (error) {
console.error(
`Unable to establish collection handles in OrdersDAO: ${error}`
)
}
}
static async getOrders() {
try {
const cursor = orders.find({})
const allOrders = await cursor.toArray()
return allOrders
} catch (e) {
console.error(`OrdersDAO.getOrders() ~~~ Unable to get orders: ${e}`)
return { e }
}
}
static async addOrder(order) {
try {
return await orders.insertOne(order)
} catch (error) {
console.error(
chalk.greenBright(
`OrdersDAO.addOrder() ~~~ Unable to post order:) ${error}`
)
)
return { error, e }
}
}
static async deleteOrder(orderId) {
try {
const deleteResponse = await orders.deleteOne({ _id: ObjectId(orderId) })
return deleteResponse
} catch (error) {
console.log(
chalk.greenBright(
`OrdersDAO.deleteOrder() ~~~ Unable to delete order ~~~`
),
error
)
return error
}
}
还有我的订单DAO.spec.js
import { MongoClient } from 'mongodb'
import 'regenerator-runtime/runtime'
import OrdersDAO, { getOrders } from '../dao/ordersDAO'
import { mockOrder, mockOrders } from '../mocks/fixtures'
/*
I commented out below because I was trying jests manual mocks,
https://jestjs.io/docs/es6-class-mocks
*/
// import OrdersDAO, {
// mockGetOrders,
// mockAddOrder,
// mockDeleteOrder,
// mockInjectDB,
// } from '../__mocks__/ordersDAO'
// jest.mock('../src/dao/OrdersDAO')
// const getOrders = jest.fn()
describe('insert1', () => {
let connection
let db
beforeAll(async () => {
connection = await MongoClient.connect(global.__MONGO_URI__, {
useNewUrlParser: true,
useUnifiedTopology: true,
poolSize: 50,
})
db = connection.db(global.__MONGO_DB_NAME__)
})
beforeEach(async () => {
await db.collection('orders').deleteMany({})
})
afterAll(async () => {
await connection.close()
})
test('sanity check', async () => {
const num = 1
expect(num).toEqual(1)
})
test('should insert a doc into collection, mdb-memory-server', async () => {
const orders = db.collection('orders')
await orders.insertOne(mockOrder)
const insertedOrder = await orders.findOne({ orderId: 'eHjMpYG4o3' })
expect(insertedOrder).toEqual(mockOrder)
})
test('Positive, OrdersDAO.getOrders should retrieve orders', async () => {
const mockGetOrders = jest.fn()
mockGetOrders.mockReturnValue(Promise.resolve(mockOrders))
OrdersDAO.prototype.getOrders = mockGetOrders
const orders = db.collection('orders')
await orders.insert(mockOrders)
const result = await OrdersDAO.getOrders()
// result is undefined
console.log(OrdersDAO.getOrders())
})
})
测试号 2 使用内存服务器按预期工作。但我真的不知道这告诉我什么,除了它发现了我插入的虚假订单,而不是 ordersDAO 功能。
如何在 OrdersDAO 中测试我的功能,例如 getOrders()、addOrder() 等?我应该模拟这些功能然后使用内存服务器吗?既然是假数据库,我什至需要模拟或监视静态方法吗?
【问题讨论】:
标签: javascript node.js mongodb unit-testing jestjs