2

如果有人能向我澄清如何从CLI 应用程序的查询器插件测试异步代码,将不胜感激。

模块导出updateView函数,它在内部调用 async inquirer.prompt

const inquirer = require("inquirer");

const getAnswer = async (request) => {
    const answer = await inquirer.prompt(request);
    return answer;
}

想用Jest测试异步代码是否有效,但是我看到的所有Jest示例都显示了只有当我将异步函数作为参数传递时才能测试异步代码的方法。

所以我的功能必须重构为:

获取答案.js

const getAnswer = async (request, callback) => {
    const answer = await callback(request);
    return answer;
}

main.js

const inquirer = require("inquirer");
const getAnswers = require("./getAnswers");

const main = async () => {
    const request = "abc";
    const result = await getAnswers(request, inquirer.prompt);
...
}

然后测试文件将如下所示:

测试.js

const getAnswers = require("./getAnswers");

  test("async code works", async () => {
    //Arrange
    const mock = async () => {
      return "Correct Answer";
    };

    //Act
    const result = await getAnswers("abc", mock);

    //Assert
    expect(result).toEqual("Correct Answer";);
  });

如果有人可以建议是否有一种测试异步函数而不将其作为回调传递的方法,将不胜感激?

如果方法本身是正确的。

4

1 回答 1

2

您可以使用jest.mock模拟导入的依赖项,而不是将它们作为参数传递。这是单元测试解决方案:

getAnswers.js

const inquirer = require('inquirer');

const getAnswers = async (request) => {
  const answer = await inquirer.prompt(request);
  return answer;
};

module.exports = getAnswers;

getAnswers.test.js

const getAnswers = require('./getAnswers');
const inquirer = require('inquirer');

jest.mock('inquirer', () => {
  return { prompt: jest.fn() };
});

describe('59495121', () => {
  afterEach(() => {
    jest.resetAllMocks();
  });
  it('should pass', async () => {
    inquirer.prompt.mockResolvedValueOnce('Correct Answer');
    const actual = await getAnswers('abc');
    expect(actual).toBe('Correct Answer');
  });
});

覆盖率 100% 的单元测试结果:

 PASS  src/stackoverflow/59495121/getAnswers.test.js (10.172s)
  59495121
    ✓ should pass (6ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |      100 |      100 |                   |
 getAnswers.js |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.367s

源代码:https ://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59495121

于 2019-12-27T11:35:35.550 回答