用Jest测试Node.js的详细教程

1,084 阅读5分钟

本教程演示了如何在Node.js中用Jest设置测试。前面的教程已经向您展示了如何设置Node.js应用程序,而本教程为您的Node.js项目设置了一个测试环境。让我们通过将Jest设置为测试框架来深入了解它。

Node.js与Jest的设置

为了让我们的测试启动和运行,通过在命令行中安装Jest作为开发依赖项来设置它。

npm install --save-dev jest

在你的package.json文件中,创建一个新的npm脚本,运行Jest。

{
  ...
  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "test": "jest"
  },
  ...
}

此外,我们希望在用Jest编写的测试中拥有更多配置。因此,传递一个额外的Jest配置文件给你的Jest脚本。

{
  ...
  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "test": "jest --config ./jest.config.json"
  },
  ...
}

接下来,我们可以在一个配置文件中为Jest定义这个可选配置。在命令行中创建它。

touch jest.config.json

在这个Jest配置文件中,添加以下测试模式匹配来运行所有应被Jest执行的测试文件。

{
  "testRegex": "((\\.|/*.)(spec))\\.js?$"
}

testRegex 配置是一个正则表达式,可以用来指定你的Jest测试所在的文件的命名。在这种情况下,这些文件的名字是*spec.js 。这样你就可以将它们与*src/*文件夹中的其他文件明确分开。最后,在一个新的src/spec.js 文件中,在你的源代码文件旁边添加一个测试文件。首先,在命令行中创建测试文件。

touch src/spec.js

其次,在这个新文件的测试套件中实现你的第一个测试案例:

describe('My Test Suite', () => {
  it('My Test Case', () => {
    expect(true).toEqual(true);
  });
});

现在你应该能够运行npm test ,用你的测试用例执行你的测试套件。对于你之前的测试用例,测试应该是绿色的(有效的,成功的),但是如果你把测试改成其他的东西,比方说expect(true).toEqual(false); ,它应该是红色的(无效的,失败的)。恭喜你,你已经用Jest运行了你的第一个测试!

最后但并非最不重要的是,添加另一个npm脚本来观察你的Jest测试。通过使用这个命令,你可以让你的测试在一个命令行标签中持续运行,而你在另一个命令行标签中启动你的应用程序。每当你在开发你的应用程序时改变了源代码,你的测试将通过这个观察脚本再次运行。

{
  ...
  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "test": "jest --config ./jest.config.json",
    "test:watch": "npm run test -- --watch"
  },
  ...
}

现在你可以在观察模式下运行你的Jest测试。这样做,你会有一个打开的终端标签,用于在观察模式下的Jest测试,npm run test:watch ,还有一个打开的终端标签,用于启动你的Node应用程序,npm start 。每当你改变一个源文件,你的测试就会因为观察模式而再次运行。

用Jest测试Node.js

到目前为止,我们还没有测试任何实现逻辑。我们之前的测试是独立的,没有任何来自我们应用程序的业务逻辑的外部依赖。然而,在一个真实的应用程序中,你想测试实际Node.js应用程序的逻辑。假设我们在src/sum.js文件中有一个将两个整数相加的函数,需要进行测试。

function sum(a, b) {
  return a + b;
}

export default sum;

该函数被导出,因为它被用于我们应用程序的其他部分。然而,即使它只在这一个文件中使用而没有导出语句,你仍然可以为了测试而导出它。现在,在我们的src/spec.js--或者更具体的src/sum.spec.js测试文件中,我们可以导入这个函数并进行测试。

import sum from './sum.js';

describe('sum function', () => {
  it('sums up two integers', () => {
    expect(sum(1, 2)).toEqual(3);
  });
});

恭喜你,你已经在Node.js中建立了你的第一个单元测试。当你用npm test 再次运行你的测试时,你应该在命令行上看到一个成功的测试。如果测试因为失败而变成红色,你需要检查你的业务逻辑(或测试)是否设置正确。

Node.js的异步Jest测试

用Jest测试JavaScript原语、复杂对象和数组是一个很好的开始。最终你也会在测试函数被调用的情况下运行。因此,你需要一个工具来监视、存根或模拟函数。Jest有强大的实用程序来帮助你。让我们先来看看我们要测试的用例,然后再看看如何用Jest来测试它。在一个新的src/call-my-function.js文件中实现以下函数。

function callMyFunction(callback) {
  callback();
}

export default callMyFunction;

这个函数只接受另一个函数作为参数--它是一个高阶函数--并简单地调用这个函数。让我们在我们的src/index.js文件中使用它。

import sum from './sum.js';
import callMyFunction from './call-my-function.js';

console.log(sum(1, 2));

callMyFunction(function() {
  console.log('Hello world');
});

我们将如何测试这个函数在其他函数中被调用?在一个新的src/call-my-function.spec.js文件中,让我们为这个新的高阶函数编写测试。

import callMyFunction from './call-my-function.js';

describe('callMyFunction function', () => {
  it('calls the passed function', () => {
    callMyFunction(callback);

    expect(callback).toHaveBeenCalledTimes(1);
  });
});

现在我们可以用一个Jest函数来测试它,这个函数被用来代替空函数。

import callMyFunction from './call-my-function.js';

describe('callMyFunction function', () => {
  it('calls the passed function', () => {
    const callback = jest.fn();

    callMyFunction(callback);

    expect(callback).toHaveBeenCalledTimes(1);
  });
});

就这样了。测试应该是成功的,因为我们要测试的函数中的函数被调用了。


Jest是访问Node.js应用程序的测试运行器和断言库的一种强大方式。你可以在这个GitHub仓库中找到一个准备好的Node.js应用程序。