使用 Mocha 运行测试也会启动主程序



我正在尝试使用 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是因为您在定义方法后立即告诉它。

相关内容

  • 没有找到相关文章

最新更新