Как переписать (или смоделировать) метод класса с помощью Jest для проверки функции? - PullRequest
0 голосов
/ 06 июня 2018

У меня проблема с модульным тестом функции, которая вызывает класс.Кажется, всегда называют «официальный» экземпляр класса, а не мой издевательский класс.Я не могу заставить мою функцию использовать мой смоделированный экземпляр ...

Есть файл с функцией, которую я хочу проверить:

const myClass = require('./myClass');
const instance = new myClass();

module.exports.functionToTest = async function () {

    // Some stuff...

    const value = await instance.myMethod();

    // Some stuff that define a result variable (partially with value).

    return result;
}

Есть файл с моимопределение класса:

module.exports = class myClass {
    async myMethod() {
        const result = await someStuffWillResolveMaybeTrueOrFalse();

        console.log('We used the original myMethod... Mocking has failed.');

        return result;
    }
}

Существует файл спецификации:

const myFile = require('./myFile');
const myClass = require('./myClass');

describe('My test', async () => {
    it('should mock myClass.myMethod in order to return false', () => {
        const instance = new myClass();
        instance.myMethod = jest.fn().mockResolvedValue(false);

        const result = await myFile.functionToTest();

        expect(result).toBeTruthy();
    }
}

К сожалению, мой тест проходит (потому что myMethod возвращает "true") и записывает "Мы использовали оригинальный myMethod ..Пересмешка не удалась. "

Поэтому я хочу, чтобы мой тест всегда проваливался, насмехаясь над тем, чтобы myMethod возвращал false.

Вы можете мне помочь?Спасибо за ваше время.

1 Ответ

0 голосов
/ 07 июня 2018

Hm.Я нашел решение.

Видите.Изменение в моем файле с целевой функцией.

const myClass = require('./myClass');
// const instance = new myClass(); <== Not here...

module.exports.functionToTest = async function () {
    const instance = new myClass(); // <== ...but there.

    // Some stuff...

    const value = await instance.myMethod();

    // Some stuff that define a result variable (partially with value).

    return result;
} 

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

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

// I specify to Jest that I'll mock a file
jest.mock('./myClass');
const myClass = require('./myClass');

// I prepare the mock function. In that case a promise wich resolve 'false'
const mMock = jest.fn().mockResolvedValue(false);

// I mock the method 'myMethod' in 'myClass'
myClass.mockImplementation(() => {
    return {
        myMethod: mMock
    };
});


// Then, I just take the test
describe('My test', async () => {
    it('should mock myClass.myMethod in order to return false', () => {
        const result = await myFile.functionToTest();

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