Как написать юнит-тест в шутку для функции класса в слое базы данных моего javascript веб-приложения? - PullRequest
0 голосов
/ 11 апреля 2020

Я использую jest для написания модульных тестов для моего приложения Express. Я новичок в тестировании, а также в использовании jest, поэтому мне трудно писать модульный тест для функций моего класса, которые представляют уровень моей базы данных приложения. Когда я запускаю тест, программа пытается вызвать db, но не может этого сделать, попадая в блок catch. Где я go ошибся? Спасибо.

// 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();
});

1 Ответ

0 голосов
/ 11 апреля 2020

Идея состоит в том, чтобы смоделировать значения, которые обычно возвращаются вашим методом. Для этого вы можете использовать функцию mockResolvedValue, чтобы обойти вызов БД и возвращать необходимые тестовые данные каждый раз, когда вызывается findAll. Например, у вас может быть что-то вроде:

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

Проверьте Jest Документация о том, как макетировать модули.

...