Chai-spies: ожидаем (). To.have.been.called () сбой на локальных методах - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь протестировать некоторый код, написанный на Typescript, и мои тесты не выполняются. Я немного упростил код, чтобы разбить мою проблему. Я новичок в ts / js, поэтому, скорее всего, я просто упускаю что-то очевидное ..

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

Ниже приведены два различных примера и их результаты.

Мой вызывающий Функция callFoo() находится в моем moduleUnderTest файле. Когда callFoo() вызывает foo() в другом файле, мой тестовый пример проходит.

файл moduleUnderTest (где foo() происходит из вспомогательного файла)

import { foo } from "path/to/helper/methods";

export function callFoo() {
    foo();
}

вспомогательный метод

export function foo() {
    console.log("Foo was called");
}

и вот мой тестовый код

import { callFoo } from "path/to/module/under/test";
import * as helperMethods from "path/to/helper/methods";

chai.use(spies);
const expect = chai.expect;

suite("Testing Foo", () => {

    test("foo", async () => {
        const spy = chai.spy.on(helperMethods, "foo");
        await callFoo();
        expect(spy).to.have.been.called();
    });

});

Вывод (успех)

enter image description here

Однако, если я переместу foo() в тот же файл moduleUnderTest и проведу тот же самый точный тест, он не пройдёт.

export function callFoo() {
    foo();
}

export function foo() {
    console.log("local foo was called");
}

Тестовый класс

import { callFoo } from "path/to/module/under/test";
import *  as moduleUnderTest from "path/to/module/under/test";

chai.use(spies);
const expect = chai.expect;

suite("Testing Foo", () => {

    test("foo", async () => {
        const spy = chai.spy.on(moduleUnderTest, "foo");
        await callFoo();
        expect(spy).to.have.been.called();
    });

});

Выход (отказ)

enter image description here enter image description here

Таким образом, вы можете увидеть на выходе метод был назван

локальный foo был назван

, но expect().to.have.been.called() не работает. Это почему? Чего мне не хватает?

1 Ответ

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

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

Вот статья https://medium.com/@DavideRama / mock-spy-exported-functions-in-a-single-module-in-jest-cdf2b61af642

Эта проблема имеет делать с тем, как код компилируется. Если вы не используете машинопись и просто используете javascript, я настоятельно рекомендую прочитать статью, на которую есть ссылки.

tdlr (решение для машинописи);

  1. Переместить вспомогательную функцию (т.е. foo()) в свой собственный файл модуля

ИЛИ

Используйте анонимную функцию:

С https://github.com/facebook/jest/issues/936#issuecomment -532538300

Не работает:

export function doSomething(a, b) {}

Работает:

export const doSomething = function (a, b) {}

Я должен также отметить, что я использую mocha, и проблема GitHub, на которую я ссылался, предоставляет некоторые другие решения, если использовать jest, который может быть более подходящим. В моем случае я решил переключиться с именованной функции на анонимную функцию.

...