如何模拟节点readline?

时间:2019-01-06 09:49:42

标签: javascript node.js typescript jestjs

当用户在CLI提示符下输入getUserInput时,

y会调用一个函数:

export const getUserInput = (fn: () => void) => {
  const { stdin, stdout } = process;
  const rl = readline.createInterface({ input: stdin, output: stdout });
  rl.question("Can you confirm? Y/N", (answer: string) => {
    if (answer.toLowerCase() === "y") {
      fn();
    }
    rl.close();
  });
};

我需要为getUserInput模拟节点的readline创建测试。

当前,我尝试了以下操作,但没有成功,得到:

TypeError: rl.close is not a function

我的模拟实现是否正确?如果不正确,该如何解决?

jest.mock("readline");
describe.only("program", () => {
    it.only("should execute a cb when user prompt in cli y", () => {
        const mock = jest.fn();
        getUserInput(mock);
        expect(mock).toHaveBeenCalled();
     });
 });

__mocks__/readline.ts(与node_module相邻的目录)

module.exports ={
  createInterface :jest.fn().mockReturnValue({
    question:jest.fn().mockImplementationOnce((_questionTest, cb)=> cb('y'))
  })
}

1 个答案:

答案 0 :(得分:0)

我可以通过添加close函数来解决此问题。

module.exports = {
  createInterface: jest.fn().mockReturnValue({
    question: jest.fn().mockImplementationOnce((_questionTest, cb) => cb("y")),
    close: jest.fn().mockImplementationOnce(() => undefined)
  })
};