本教程演示了如何在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应用程序。