【问题标题】:How to test a static class method in MongoDB-Memory-Server?如何在 MongoDB-Memory-Server 中测试静态类方法?
【发布时间】: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


    【解决方案1】:

    基本上我发现我只需要监视方法并模拟返回值。

        test('Positive, OrdersDAO.getOrders should retrieve orders', async () => {
            jest.spyOn(OrdersDAO, 'getOrders').mockReturnValue(mockOrders)
            const result = await OrdersDAO.getOrders()
            expect(result).toEqual(mockOrders)
            expect(result.length).toBe(2)
    

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2021-03-09
      • 2017-10-12
      • 2021-03-12
      相关资源
      最近更新 更多