Jest - при использовании функции spyOn убедитесь, что шпионская функция не вызывается - PullRequest
5 голосов
/ 25 апреля 2019

Из заметок Jest: Примечание: по умолчанию jest.spyOn также вызывает метод spied.

В моем компоненте Angular.

ngAfterViewInit(): void {
  this.offsetPopoverPosition();
}

В моей спецификации:

it('ngAfterViewInit() method should call offsetPopoverPosition() method', () => {
    const mockListener = jest.spyOn(cmp, 'offsetPopoverPosition');
    const spy = mockListener.mockImplementation(() => {
      console.log('in the mock');
    });

    cmp.ngAfterViewInit();
    expect(spy).toHaveBeenCalled();
  });

Простой.Все же оригинальная функция все еще вызывается.Я проверил документы Jest 23.x: https://jestjs.io/docs/en/23.x/jest-object#jestspyonobject-methodname https://jestjs.io/docs/en/23.x/mock-function-api#mockfnmockimplementationfn

И несколько примеров в интернете, но я не могу помешать jest вызвать оригинальный метод offsetPopoverPosition().

Любые идеи?

Я перехожу на проблему с Jest GitHub, которая по какой-то причине закрыта без разрешения.

Jest spyOn () вызывает саму функцию вместо поддельной

1 Ответ

0 голосов
/ 30 апреля 2019

Мне кажется, у меня та же проблема, поэтому, может быть, мы помогаем друг другу.У меня есть 3 файла

  • один называется dbManager.js
  • другой называется mssqlPool.js
  • , а затемтестовый файл dbManager.test.js

Проверенные файлы находятся в папке . / src / db .

Тестовый файл находится в папке . / test / db (в основном скопировал дерево папок src).

Я хочу издеваться mssqlPool.js

module.exports = {
  mssqlPool: async config => {
    // actual connection with an await (in case it matters)
  }
}

Вот DBManger, который является классом с конструктором:

const { mssqlPool } = require('./mssqlPool');

module.exports = class DBManager {
  constructor(config) {}
}

async initPool() {
    if (global.DB_TYPE === 'mssql') {
      this.pool = await mssqlPool(this.config);
      return true;
    }}

const mssqlPool = require('../../../src/helpers/db/mssqlPool');
const DbManager = require('../../../src/helpers/db/dbManager');

let dbManager;

beforeEach(() => {
  const mockedConfig = {
    type: '<type: mssql/postgresql>',
    user: '<user>',
    password: '<mdp>',
    server: '<host>',
    database: '<db_name>',
    pool: {
      max: 10,
      min: 0,
      idleTimeoutMillis: 30000
    }
  };
  dbManager = new DbManager(mockedConfig);

  jest.spyOn(mssqlPool, 'mssqlPool').mockImplementation(() => Promise.resolve());
});

afterEach(() => {
  jest.restoreAllMocks();
});

describe('DbManager', () => {
  test('initPool', async () => {
    global.DB_TYPE = 'mssql';
    await dbManager.initPool();

    expect(mssqlPool.mssqlPool).toHaveBeenCalled();
  });});

И это не сработает, тест не пройден, потому что он фактически пытается использовать функцию mssqlPool и подключиться кБД, используя мой mockedConfig, тогда как я явно издевался над этой функцией с помощью

  jest.spyOn(mssqlPool, 'mssqlPool').mockImplementation(() => Promise.resolve());

. Я уже изменил свой файл mssqlPool с module.exports=config=>{} на module.exports={mssqlPool:config=>{}}, чтобы иметь возможность использовать spyOn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...