PHP转JS新手求助:如何从命令行加载JS代码并进行单元测试?
从PHP转JS:如何加载代码并做命令行单元测试
作为从PHP转过来的JS新手,这种“怎么加载代码做测试”的困惑太正常了!毕竟JS的模块系统和PHP的require_once/Composer自动加载确实不一样,我来一步步帮你搞定。
首先,你的Calculator类是用自执行函数挂在全局App对象上的,这种写法在浏览器里没问题,但Node.js(命令行环境)默认没有全局的App对象,所以我们得先解决代码的加载问题,再谈测试。
第一步:让你的代码能被Node.js加载
有两种方式,选哪种看你要不要保留浏览器兼容性:
方式1:修改代码支持双环境(浏览器+Node)
在你的Calculator.js文件最后,添加一段适配代码,既保留全局App,又支持Node的模块导出:
App.Calculator = (function () { // 原有的Calculator类代码... })(); // 新增:适配Node.js模块系统 if (typeof module !== 'undefined' && module.exports) { module.exports = App.Calculator; }
这样在浏览器里,它还是挂在App.Calculator上;在Node里,你可以用require直接导入这个类。
方式2:不修改原代码,在测试里模拟全局App
如果你不想动原代码,可以在测试文件里手动创建全局的App对象,再加载你的代码:
// 在测试文件开头模拟全局App global.App = {}; // 加载Calculator代码,它会自动把类挂到App上 require('../src/lib/App/Calculator'); // 现在就能用App.Calculator了 const Calculator = App.Calculator;
第二步:用测试框架做单元测试(类似PHPUnit)
JS里常用的测试框架有Jest(上手简单)和Mocha(灵活),我以Jest为例,一步步来:
- 初始化项目:在项目根目录打开命令行,运行
npm init -y
这会生成package.json,类似PHP的composer.json。
- 安装Jest:
npm install --save-dev jest
--save-dev表示只在开发环境安装,类似PHP的require-dev。
- 写测试用例:在项目根目录创建
tests文件夹,新建Calculator.test.js,内容如下(和PHPUnit的测试逻辑很像):
// 如果用方式1修改了代码,直接导入 const Calculator = require('../src/lib/App/Calculator'); // 如果用方式2,就先模拟全局再导入 // global.App = {}; // require('../src/lib/App/Calculator'); // const Calculator = App.Calculator; describe('Calculator类测试', () => { let calculator; // 每个测试前都初始化一个新的Calculator实例 beforeEach(() => { calculator = new Calculator(); }); test('初始化时默认值正确', () => { expect(calculator.getAmountTendered()).toBe(0.00); expect(calculator.getChange()).toBe(0.00); }); test('当应付款为正数时,计算找零正确', () => { calculator.setAmountDue(10.50); calculator.setAmountTendered(20.00); expect(calculator.getChange()).toBe(9.50); }); test('当应付款为负数时,计算逻辑正确', () => { calculator.setAmountDue(-5.00); calculator.setAmountTendered(10.00); expect(calculator.getChange()).toBe(-(10.00 + (-5.00))); // 即-5.00 }); });
- 运行测试:在
package.json里添加测试脚本,找到scripts部分改成:
"scripts": { "test": "jest" }
然后命令行运行:
npm test
就能看到测试结果了,和PHPUnit的输出类似,会告诉你哪些测试通过,哪些失败。
第三步:不用框架,直接在命令行测试(快速验证)
如果只是想快速验证代码,不用测试框架也可以:
在项目根目录创建test.js,内容:
// 方式1:修改代码后 const Calculator = require('./src/lib/App/Calculator'); // 方式2:不修改代码 // global.App = {}; // require('./src/lib/App/Calculator'); // const Calculator = App.Calculator; // 创建实例并测试 const calc = new Calculator(); calc.setAmountDue(15.00); calc.setAmountTendered(25.00); console.log('找零金额:', calc.getChange()); // 应该输出10.00 calc.clear(); console.log('清空后已付款:', calc.getAmountTendered()); // 应该输出0.00
然后命令行运行:
node test.js
就能看到输出结果了。
一些额外小提示
- JS里的模块系统现在还有ES Modules(用
import/export),不过Node默认还是CommonJS(require/module.exports),新手先从CommonJS入手更简单。 - 如果你习惯了PHPUnit的断言,Jest的断言语法很直观,比如
expect(value).toBe(expected)就类似PHPUnit的assertEquals。
内容的提问来源于stack exchange,提问作者Richard A Quadling
相关产品推荐
相关产品推荐

