Тест asyn c функция с шуткой - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь смоделировать объект соединения с базой данных, чтобы выполнить мои тесты, но ошибка, которую я получаю, всегда одинакова.

Я уже пробовал с другими решениями, но имитация всегда возвращает мне то же самое объект. После небольшого исследования и изменений я нашел другое решение, подобное этому

// connection.js
/* istanbul ignore file */
const mysql = require('mysql');

let pool;
const config = require('./config.js');

const connection = getPool();
/**
 * Singleton pool connection
 * @return {Pool} the pool connection
 */
function getPool() {
  if (pool) {
    return pool;
  }
  pool = mysql.createPool(config);
  return pool;
}

module.exports = connection;
// database.js
const connection = require('./connection')
function find() {
  return new Promise((resolve, reject) => {
    const query = 'select * from table`;
    connection.query(query, (err, res) => {
      if (err) {
        reject(new DatabaseError('Error'));
      }
      resolve(res);
    });
  });
}

, и, наконец, мой тестовый файл выглядит следующим образом


const database = require('./database.js');
const connection = require('./connection.js');
const { expect } = chai;
const DatabaseError = require('../../../src/errors/DatabaseError');

jest.mock('./connection.js');
  describe('testing find all', () => {
    test('testing error ', async () => {
      connection.query.mockImplementation(() => (q,  cb) => cb(res, null, null));
      try {
        await database.find();
      } catch (e) {
      expect(err).to.be.an.instanceof(DatabaseError);
      }
    });
  });

Ошибка, которую я получаю, всегда одинакова

    : Timeout - Async callback was not invoked within the 10000ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 10000ms timeout specified by jest.setTimeout.Error:

      11 |   describe('test find all', () => {
    > 12 |     test('testing error ', async () => {

Я уже пытался использовать оператор return и async done, но эта проблема не решается

любая помощь?

Причина, по которой я использую mockimplementation, заключается в том, что мне нужно изменить каждый тест, который query значение

1 Ответ

2 голосов
/ 17 апреля 2020

Вы должны посмеяться над реализацией метода connection.query следующим образом:

connection.query.mockImplementation((q, cb) => cb(mError, null));

Видите разницу? Вы высмеиваете это как функцию высокого порядка. Это не правильно. Вот рабочий пример:

connection.js:

/* istanbul ignore file */
const mysql = require('mysql');

let pool;
const config = require('./config.js');

const connection = getPool();
/**
 * Singleton pool connection
 * @return {Pool} the pool connection
 */
function getPool() {
  if (pool) {
    return pool;
  }
  pool = mysql.createPool(config);
  return pool;
}

module.exports = connection;

database.js:

const connection = require('./connection');

function find() {
  return new Promise((resolve, reject) => {
    const query = 'select * from table';
    connection.query(query, (err, res) => {
      if (err) {
        return reject(new Error('Error'));
      }
      resolve(res);
    });
  });
}

module.exports = { find };

config.js:

module.exports = {};

database.test.js:

const database = require('./database.js');
const connection = require('./connection.js');

jest.mock('./connection.js');

describe('testing find all', () => {
  test('testing error ', async () => {
    const mError = new Error('network');
    connection.query.mockImplementation((q, cb) => cb(mError, null));
    try {
      await database.find();
    } catch (e) {
      expect(e).toBeInstanceOf(Error);
    }
  });
});

результаты модульных испытаний с отчетом о покрытии:

 PASS  stackoverflow/61261886/database.test.js (10.531s)
  testing find all
    ✓ testing error  (5ms)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |   88.89 |       50 |     100 |   88.89 |                   
 config.js   |     100 |      100 |     100 |     100 |                   
 database.js |    87.5 |       50 |     100 |    87.5 | 10                
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        12.222s

исходный код: https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/61261886

...