这两周都在写一个和项目相关的计算器,算是试行的一个测试驱动开发的模式,测试代码有写了几千行了,因为对于原生Node.js测试还不是很熟悉,有很多复制粘贴的代码,其中一个就是设计到debug模式。
import assert from "node:assert";
import { test } from "node:test";
export class Calculator {
debug = false;
constructor(options, debug = false) {
this.debug = debug;
this.options = options;
}
getTotal() {
// Say we want to print out the options when we're in debug mode.
if (!!this.debug) {
console.log('options: ', this.options);
}
// Do some logic and return the total.
return 234;
}
}
test("Calculate", async (t) => {
await t.test("Test case 1", () => {
const options = {
// ... some options.
};
const calculator = new Calculator(options, true);
assert.strictEqual(calculator.getTotal(), 234);
});
await t.test("Test case 2", () => {
const options = {
// ... some options.
};
const calculator = new Calculator(options, true);
assert.strictEqual(calculator.getTotal(), 234);
});
await t.test("Test case 3", () => {
const options = {
// ... some options.
};
const calculator = new Calculator(options);
assert.strictEqual(calculator.getTotal(), 234);
});
});
非常简单的一个例子,假如我们的测试非常多时,每次传入debug=true
第二个参数有点繁琐,我想的是可以创建一个factory函数来简化。
import assert from "node:assert";
import { test } from "node:test";
export class Calculator {
debug = false;
constructor(options, debug = false) {
this.debug = debug;
this.options = options;
}
getTotal() {
// Say we want to print out the options when we're in debug mode.
if (!!this.debug) {
console.log('options: ', this.options);
}
// Do some logic and return the total.
return 234;
}
}
function createCalculatorWithDebug(options) {
return new Calculator(options, true);
}
test("Calculate", async (t) => {
await t.test("Test case 1", () => {
const options = {
// ... some options.
};
const calculator = createCalculatorWithDebug(options);
assert.strictEqual(calculator.getTotal(), 234);
});
await t.test("Test case 2", () => {
const options = {
// ... some options.
};
const calculator = createCalculatorWithDebug(options);
assert.strictEqual(calculator.getTotal(), 234);
});
await t.test("Test case 3", () => {
const options = {
// ... some options.
};
const calculator = createCalculatorWithDebug(options);
assert.strictEqual(calculator.getTotal(), 234);
});
});
assert.strictEqual(calculator.calculate(selections[0], selections[1], amount, true), 0);
当重构代码时,可能会将得出总数的函数改为calculator.getResult(),那么测试文件中所有的函数都要修改。
assert.strictEqual(calculator.calculate(selections[0], selections[1], amount, true), 0);
// 改成
assert.strictEqual(calculator.getResult(), 0);
发表回复