Выполнение утверждений в обратном вызове с поддельным модулем readline с помощью jest - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь проверить несколько вещей внутри обратного вызова, который имеет дело с пользовательским вводом.Я использую модуль readline из nodejs в Jest (аналогично примеру , приведенному в документации).Я не могу понять, как я могу сделать утверждения внутри этого обратного вызова.

Например: в рамках обратного вызова readline.createInterface().question() я звоню writeFileSync.Я хочу проверить как или , если вызывается writeFileSync (или любая другая функция в обратном вызове).

// file.js
const { writeFileSync } = require('fs');
const readline = require('readline');

const copyFile = () => {
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    rl.question('What is the file name?', (userInput) => {
        /**
         * I want to some assertions on this function.
         * For example: with which arguments was it called?
         * Or how often is it called?
         */
        writeFileSync();
    });
}

И в тесте

//file.test.js
const { writeFileSync } = require('fs')
jest.mock('fs');

describe('copies files based on user input', () => {
    test('calls writeFileSync', () => {
        expect(writeFileSync).toHaveBeenCalled();
    });
});

Самое близкое, что я получил:

// __mocks__/readline.js

module.exports = {
    createInterface: jest.fn().mockReturnValue(
        {
            question: jest.fn().mockImplementation(
                (question, cb) => {
                    writeFileSync()
                }
            )
        }
    )
}

Но с этим я тестирую тест, я заметил.Кто-нибудь знает, как я могу проверить, что находится внутри обратного вызова rl.question()?Я с удовольствием предоставлю больше информации, если необходимо!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я нашел это: нужно смоделировать реализацию и вызвать аргумент обратного вызова (cb в этом случае):

// __mocks__/readline.js
module.exports = {
    createInterface: jest.fn().mockReturnValue({
        question: jest.fn()
            .mockImplementationOnce((questionText, cb) => {cb('')}) // test empty arg
            .mockImplementationOnce((questionText, cb) => {cb('foo')})
            .mockImplementationOnce((questionText, cb) => {cb('bar')})   
        })
    })
};

Возвращает '', foo, bar как смоделированные пользовательские значения ввода.

0 голосов
/ 13 октября 2018

это называется тестовыми шпионами, и Sinon.Js имеет множество помощников, проверьте документы для примеров

здесь, мы можем шпионить за fs.writeFileSync перед запуском этого теста, изатем используйте шпиона в вашем тесте.

const spy = sinon.spy(writeFileSync);

, затем вы можете подтвердить вызов шпиона с помощью свойств шпиона , таких как:

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