【问题标题】:How do I write a unit test in jest for a class function in the database layer of my javascript web application?如何在我的 javascript Web 应用程序的数据库层中为类函数编写单元测试?
【发布时间】:2020-04-12 21:11:16
【问题描述】:

我正在使用 jest 为我的 Express 应用程序编写单元测试。我是新的测试和使用 jest,所以我很难为代表我的应用程序的数据库层的类函数编写单元测试。当我运行测试时,程序尝试调用数据库,但无法这样做,落入了 catch 块。我哪里做错了?谢谢。

//summary.ts

import db from '../db/index';
import { generateError } from '../lib/generateError';

const SummaryModel = class {
  static async findAll() {
    const text = `SELECT * FROM public.summary`;
    let result : any = {};
    try {
      result = await db.query(text);
    } catch(e) {
      if (e) {
        throw generateError(500, 'could not query db');
      }
    }
    const summaries = {
      record: result.rows,
      count: result.rowCount
    }
    return summaries;
  }
}
export default SummaryModel;

//summary.test.js

const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');

test('should return an object with an array and number', async done => {
  const summaries = await SummaryModel.default.findAll();
  expect(typeof summaries.record).toBe('array');
  expect(typeof summaries.count).toBe('number');
  done();
});

// summary.test.js 已更新

const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');

test('should return an object with an array and number', async done => {
  const SummaryModel = {
    default: {
      findAll: jest.fn()
    },
  }
  const resp = {
    record: [{},{}],
    count: 2,
  }
  SummaryModel.default.findAll.mockResolvedValue(resp);

  const summaries = await SummaryModel.default.findAll();
  expect(summaries.record.length).toBe(2);
  expect(summaries.count).toBe(2);
  expect(typeof summaries.record).toBe('object');
  expect(typeof summaries.count).toBe('number');
  done();
});

【问题讨论】:

    标签: javascript postgresql typescript jestjs ts-jest


    【解决方案1】:

    这个想法是模拟通常由您的方法返回的值。为此,您可以使用函数mockResolvedValue 绕过对数据库的调用,并在每次调用findAll 时返回您想要的测试数据。 例如,你可以有类似的东西:

    SummaryModel.default.findAll.mockResolvedValue({
      record: [{}, {}], // return some test data here
      count: 2,
    }
    

    查看 Jest documentation 了解如何模拟模块。

    【讨论】:

    • 谢谢。这是非常赞赏。我已经用工作代码更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2021-03-27
    • 2015-05-30
    相关资源
    最近更新 更多