почему jest v24 mocking класс требует закрытых методов - PullRequest
0 голосов
/ 14 февраля 2019

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

Как создать макет для каждого теста?

Дополнительная информация:

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

ИспользованиеНиже приведен пример с jest v23, ранее я мог смоделировать класс Randomiser следующим образом:

const Mock = jest.fn<Randomiser>(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));

, который успешно компилируется и компилируется.

Начиная с v24 функция fn принимает и сложение generic <T, Y extends any[]> Я не знаю, имеет ли это отношение к изменению поведения, но теперь я получаю сообщение об ошибке:

Отсутствует свойство 'rand' в типе '{getRandom: Mock;} 'но требуется в типе' Randomiser'.ts (2741)

import "jest";

class Randomiser {
    public getRandom(): number {
        return this.rand();
    }
    private rand(): number {
        return Math.random();
    }
}

class Multiplier {
    private randomiser: Randomiser;
    constructor(randomiser: Randomiser) {
        this.randomiser = randomiser;
    }

    multiplyRandom(factor: number): number {
        return Math.floor(this.randomiser.getRandom() * factor);
    }
}

describe("tests", () => {
    it("10 x 2 = 20", () => {
        const Mock = jest.fn<Randomiser, any>(() => ({
            getRandom: jest.fn().mockReturnValue(10),
            rand: jest.fn() //with this line I get an error because it should be private, without this line I get the error above.
        }));
        expect(new Multiplier(new Mock()).multiplyRandom(2)).toBe(20);
    })
})

Я ожидал, что смогу написать мои макеты так же, как я был с v23, то есть я мог издеваться нади нужно только имитировать функции, которые я собирался вызвать.

Теперь мне нужно смоделировать все функции, включая частные функции и частные свойства, на которые он потом жалуется, не являются личными.

1 Ответ

0 голосов
/ 10 августа 2019

Два решения:

1.Используйте Partial<Type>, что позволит вам частично смоделировать ваш класс:

const Mock = jest.fn<Partial<Randomiser>, []>(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));

Затем приведите свой макет к типу вашего класса, чтобы ввести его, например:

const mock: Randomiser = new Mock() as Randomiser;
expect(new Multiplier(mock).multiplyRandom(2)).toBe(20);

2.Не указывайте тип для макета.

Другой способ - не указывать тип для макета, что делает тип макета any.

const Mock = jest.fn(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));

ТогдаВы можете ввести свой макет как есть, но, конечно, в этом случае он не будет напечатан.

const mock = new Mock();
expect(new Multiplier(mock).multiplyRandom(2)).toBe(20);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...