如何在Node.js中为readline编写测试?

3

我正在编写一个使用readline获取输入的函数的测试。以下是一个示例:

index.js

const readline = require('readline');

async function input() {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  const inputNum = await new Promise((resolve) => {
    rl.question('Enter party serial number: ', resolve);
  });
  rl.close();

  return inputNum;
}

module.exports = input;

input-test.js

const chai = require('chai');
chai.should();
const input = require('../index.js');

it('test for inputNum', async function () {
  const res = await input();
  res.should.be.equal('1');
});

此示例的Replit链接。如何在运行测试期间自动化输入步骤?

1个回答

0
如果你想测试readline(或任何依赖于异步回调的函数),我建议你模拟它。你可以使用例如Sinon stub来实现。

example.ts:

export const example = (): Promise<string> => {
  const readlineInterface = createInterface({
    input: process.stdin,
    output: process.stdout,
  });

  return new Promise((resolve) => {
    readlineInterface.question(`Your answer: `, (answer) => {
      resolve(answer);

      readlineInterface.close();
    });
  });
};

example.spec.ts:

import { expect } from "chai";
import * as readline from "readline";
import { stub, SinonStub } from "sinon";
import { example } from "./example";

let readlineStub: SinonStub<any, any>;

describe("Testing readline", () => {
  afterEach(() => {
    if (readlineStub) readlineStub.restore();
  });

  it("Should resolve answered value", (): Promise<void> => {
    let answerCallbackFn;

    const answer = 42;

    readlineStub = stub(readline, "createInterface").callsFake((): any => {
      return {
        question: (_message, cb) => {
          answerCallbackFn = cb;
        },
        close: () => undefined,
      };
    });

    return new Promise((resolve, reject) => {
      example()
        .then((value) => {
          expect(value).eq(answer);
          resolve();
        })
        .catch((err) => {
          reject(err);
        });

      answerCallbackFn(answer);
    });
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接