我正在尝试使用 Mocha 来测试 CLI 应用程序。测试运行良好,但是当我启动测试程序时,它还启动了主应用程序:
$ npm run test
> standardize-js@0.2.2 test C:UsersGaspardDocumentsCodestandardize-js
> mocha "./source/**/*.spec.js"
? Choose your project language or framework (Use arrow keys) //<-- THIS IS THE PROGRAM
> Javascript
Typescript
AngularJS
Main function //<-- THIS IS THE TEST
ask if the configuration is valid
Configuration is not valid, terminating program.
√ should return false if the configuration is not accepted
1 passing (29ms)
我对测试世界有点陌生,我真的很难理解我做错了什么。
以下是用于启动摩卡的 NPM 脚本:
"test": "mocha "./source/**/*.spec.js""
这是我的测试方法:
/* eslint-disable func-names */
const { expect } = require("chai");
const main = require("./index").test;
describe("Main function", function() {
describe("ask if the configuration is valid", function() {
it("should return false if the configuration is not accepted", function() {
const fakeAnswer = false;
expect(main.validateConfiguration(fakeAnswer)).to.equal(false);
});
});
});
这是我index.js
文件:
function validateConfiguration(answer) {
if (answer === false) {
console.log(chalk.red("Configuration is not valid, terminating program."));
return false;
}
return true;
}
const run = async () => {
//MAIN FUNCTION
};
run();
// Export functions and variables to be able to test
exports.test = {
validateConfiguration
};
摩卡不是问题。它只是现在节点.js模块工作。
执行此操作时:
const main = require("./index").test;
Node.js将执行index.js
,然后检查module.exports
的值。如果模块(index.js
(设置或修改module.exports
则节点将导出它以供require()
使用。但请注意,为了让节点知道模块已经导出了任何内容,它必须执行 javascript 文件。
Node.js没有任何解析和分析javascript语法的能力(这是V8的工作(。与 C 或 Java 等其他语言不同,node.js 中的模块不是在语法级别实现的。因此,javascript语言不需要修改(例如。ES6 模块(为节点.js支持模块。模块只是作为设计模式实现。
在索引中.js调用 run 的文件:
run();
因此,当require()
加载index.js
时,它也会导致调用run()
。
测试库,而不是主库
解决方案是将您自己的逻辑实现为模块并进行测试,而不是测试index.js
:
mylib.js
:
function validateConfiguration(answer) {
if (answer === false) {
console.log(chalk.red("Configuration is not valid, terminating program."));
return false;
}
return true;
}
// Export functions and variables to be able to test
exports.test = { validateConfiguration };
index.js
:
const validateConfiguration = require("./mylib").test;
const run = async () => {
//MAIN FUNCTION
};
run();
现在,您可以按编写的方式使用测试脚本。
你怎么能不测试代码??
在不进行测试的情况下保持index.js
错误无的策略是从中删除所有逻辑,除了将所有其他代码连接在一起以运行应用程序的最小代码量。代码应该像"Hello World"一样简单。这样,main中的代码是如此之小,如此简单,以至于您可以使用眼球测试它是否存在错误。
index.js
中导致 bug 的任何代码都应重构到其自己的库中,以便可以单独测试。有一小部分极端情况,例如加载环境变量或打开端口 80,您无法真正分离到库中,因为它们实际上是连接逻辑。对于这种情况,您只需要非常小心。
它调用run
是因为您在定义方法后立即告诉它。