Тестирование импортированной функции с параметром с использованием Jest Mock Function / Jest spyOn - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь написать модульный тест для Node.js логики проекта c, используя Jest. Тем не менее, большинство документов обеспечивают только случай для импорта модуля или класса, однако в моем случае мой модуль содержит только функции.

На данный момент я знаю, что в Jest есть в основном три способа тестирования функции:

1) jest.fn()

2) jest.spyOn

3) jest.mock('path')

Я пробовал все три, но ни одна из них не работает.

Я хотел проверить, возвращает ли функция правильное значение (строку) при вызове. Я пробовал много разных

Вот мой код: (я покажу короткие фрагменты моего кода в последующих частях)

getDefApCode.ts

export function getDefApCode(code: string) {
  switch (code) {
    case 'BKK':
      return 'NRT'
    case 'CTX':
      return 'ICN'
    case 'SIN':
      return 'TPE'
    default:
      return code
  }
}

export function getDefaultDepartureCode(code: string) {
  return code ? getDefaultLocationCode(code) : 'LHR'
}

export function getDefaultDestinationCode(code: string) {
  return code ? getDefaultLocationCode(code) : 'ZRH'
}

getDefAPCode.spe c .ts >> Шаблон 1 (с использованием обязательного + jest.fn)

import { Connection, getConnection, getConnectionOptions } from "typeorm";
import { bootstrap, dbConnection } from "../../../src/app";
import { TourSearchParamsFactory } from "../../helpers/typeOrmFactory";
import * as getDefAPCode from "../../../src/controllers/logic/getDefAPCode";

describe("Logic Test", () => {
  beforeAll(async () => {
    await dbConnection(15, 3000);
  });

  afterAll(async () => {
    const conn = getConnection();
    await conn.close();
  });

  it("should get a default location code", async () => {
  	const getLocation = require('../../../src/controllers/logic/getDefAPCode');
  	const code = jest.fn(code => 'BKK');
  	const getCode = getLocation(code);
  	expect(getCode).toHaveBeenCalled();

   });
 });

Сообщение об ошибке:

TypeError: getLocation is not a function

getDefAPCode.spe c .ts >> Шаблон 2 (с использованием spyON)

import { Connection, getConnection, getConnectionOptions } from "typeorm";
import { bootstrap, dbConnection } from "../../../src/app";
import { TourSearchParamsFactory } from "../../helpers/typeOrmFactory";
import * as getDefaultLocationCode from "../../../src/controllers/logic/getDefaultLocationCode";


describe("Logic Test", () => {
  beforeAll(async () => {
    await dbConnection(15, 3000);
  });

  afterAll(async () => {
    const conn = getConnection();
    await conn.close();
  });

  const { getDefaultLocationCode, getDefaultDepartureCode, getDefaultDestinationCode } = require('../../../src/controllers/logic/getDefaultLocationCode');
  
  it("should get a default location code", async () => {
  	const spy = jest.spyOn(getDefaultLocationCode, 'getDefaultLocationCode');
  	getDefaultLocationCode.getDefaultLocationCode('AKJ');
  	expect(spy).toHaveBeenCalled();
  });
 });

Это некоторые сообщения об ошибках, которые появляются, когда я пробовал другой шаблон (я не отслеживал все шаблоны тестового кода, добавлю шаблон тестового кода, как только я исправлено docker)

Сообщение об ошибке:

Cannot spy the getDefaultLocationCode property because it is not a function; undefined given instead

31 | const spy = jest.spyOn (getDefaultLocationCode, 'getDefaultLocationCode');

Прошлые сообщения об ошибках

error TS2349: This expression is not callable.
      Type 'typeof import("/app/src/controllers/logic/getDefAPCode")' has no call signatures.

еще одно

expect(received).toHaveBeenCalled()

Matcher error: received value must be a mock or spy function

Received has type:  string
Received has value: "NRT"

1 Ответ

0 голосов
/ 19 февраля 2020

Я понял, что в этом случае мне не нужно использовать фиктивную функцию.

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

Вот как я редактирую свой тестовый код

  it("should get a default location code", () => {
    const code = 'BKK';
    expect(code).toHaveBeenCalled();
   });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...