Run test cases based on Mocha in Refactoring: Improved Design of Existing Code (2nd Edition)
1. Search in Githab: mocha, select the first one: mochajs/mocha, a simple, flexible and interesting JavaScript test framework for node.js and browsers. as shown in Figure 1
2. Click the link documentation to enterhttps://mochajs.org/
3. Reference installation:https://mochajs.org/#installation, as a project development dependency, use npm to install, enter the project directory: npm install –save-dev mocha. as shown in Figure 2
PS E:\wwwroot\refactoring> npm install --save-dev mocha
added 77 packages, and audited 78 packages in 20s
20 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
PS E:\wwwroot\refactoring> ls
目录: E:\wwwroot\refactoring
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/12/28 20:47 .idea
d----- 2022/12/26 20:52 1
d----- 2022/12/28 20:47 4
d----- 2022/12/28 20:50 node_modules
-a---- 2022/7/4 21:42 7 .gitignore
-a---- 2022/12/28 20:50 57330 package-lock.json
-a---- 2022/12/28 20:50 54 package.json
-a---- 2022/6/23 22:17 32 README.md
4. Reference:https://mochajs.org/#getting-started。运行:./node_modules/mocha/bin/mocha,报错:WindowsScript Host, script: E:\wwwroot\refactoring\node_modules\mocha\bin\mocha.js, error: invalid character. as shown in Figure 3
5. Set the test script in package.json:
{
"devDependencies": {
"mocha": "^10.2.0"
},
"scripts": {
"test": "mocha"
}
}
6. Then run the test: npm test, run normally. as shown in Figure 4
PS E:\wwwroot\refactoring> npm test
> test
> mocha
Array
#indexOf()
√ should return -1 when the value is not present
1 passing (14ms)
PS E:\wwwroot\refactoring>
7. Delete the file: test/test.js, create a new test file: test/province.js
import {Province} from '../4/modules/province.js';
function sampleProvinceData() {
return {
name: "Asia",
producers: [{name: "Byzantium", cost: 10, production: 9}, {
name: "Attalia",
cost: 12,
production: 10
}, {name: "Sinope", cost: 10, production: 6},],
demand: 30,
price: 20
};
}
describe('province', function () {
it('shortfall', function () {
const asia = new Province(sampleProvinceData());
assert.equal(asia.shortfall, 5);
});
});
8. Run test error: (Node:5740) warning: to load an es module, set “type”: “module” in the package.json or use the .mjs extension.. as shown in Figure 5
PS E:\wwwroot\refactoring> npm test
> test
> mocha
(node:19240) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
E:\wwwroot\refactoring\test\province.js:1
import {Province} from '../4/modules/province.js';
^^^^^^
SyntaxError: Cannot use import statement outside a module
at Object.compileFunction (node:vm:360:18)
at wrapSafe (node:internal/modules/cjs/loader:1088:15)
at Module._compile (node:internal/modules/cjs/loader:1123:27)
at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
at Module.load (node:internal/modules/cjs/loader:1037:32)
at Module._load (node:internal/modules/cjs/loader:878:12)
at ModuleWrap. (node:internal/modules/esm/translators:169:29)
at ModuleJob.run (node:internal/modules/esm/module_job:193:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:530:24)
at async importModuleDynamicallyWrapper (node:internal/vm/module:438:15)
at async formattedImport (E:\wwwroot\refactoring\node_modules\mocha\lib\nodejs\esm-utils.js:9:14)
at async exports.requireOrImport (E:\wwwroot\refactoring\node_modules\mocha\lib\nodejs\esm-utils.js:42:28)
at async exports.loadFilesAsync (E:\wwwroot\refactoring\node_modules\mocha\lib\nodejs\esm-utils.js:100:20)
at async singleRun (E:\wwwroot\refactoring\node_modules\mocha\lib\cli\run-helpers.js:125:3)
at async exports.handler (E:\wwwroot\refactoring\node_modules\mocha\lib\cli\run.js:370:5)
PS E:\wwwroot\refactoring>
9. Edit package.json, add “type”: “module”
{
"devDependencies": {
"mocha": "^10.2.0"
},
"scripts": {
"test": "mocha"
},
"type": "module"
}
10. Run the test again, and report an error: ReferenceError: Assert is not defined. as shown in Figure 6
PS E:\wwwroot\refactoring> npm test
> test
> mocha
province
1) shortfall
0 passing (10ms)
1 failing
1) province
shortfall:
ReferenceError: assert is not defined
at Context. (file:///E:/wwwroot/refactoring/test/province.js:19:9)
at process.processImmediate (node:internal/timers:471:21)
11. Edit the test file: test/province.js, add var assert = require(assert);
import {Province} from '../4/modules/province.js';
var assert = require('assert');
function sampleProvinceData() {
return {
name: "Asia",
producers: [{name: "Byzantium", cost: 10, production: 9}, {
name: "Attalia",
cost: 12,
production: 10
}, {name: "Sinope", cost: 10, production: 6},],
demand: 30,
price: 20
};
}
describe('province', function () {
it('shortfall', function () {
const asia = new Province(sampleProvinceData());
assert.equal(asia.shortfall, 5);
});
});
12. Run the test again and report an error: ReferenceError: Require is not defined within the scope of the ES module, you can use import instead. as shown in Figure 7
PS E:\wwwroot\refactoring> npm test
> test
> mocha
ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and 'E:\wwwroot\refactoring\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
at file:///E:/wwwroot/refactoring/test/province.js:2:14
at ModuleJob.run (node:internal/modules/esm/module_job:193:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:530:24)
at async importModuleDynamicallyWrapper (node:internal/vm/module:438:15)
at async formattedImport (E:\wwwroot\refactoring\node_modules\mocha\lib\nodejs\esm-utils.js:9:14)
at async exports.requireOrImport (E:\wwwroot\refactoring\node_modules\mocha\lib\nodejs\esm-utils.js:42:28)
at async exports.loadFilesAsync (E:\wwwroot\refactoring\node_modules\mocha\lib\nodejs\esm-utils.js:100:20)
at async singleRun (E:\wwwroot\refactoring\node_modules\mocha\lib\cli\run-helpers.js:125:3)
at async exports.handler (E:\wwwroot\refactoring\node_modules\mocha\lib\cli\run.js:370:5)
13. Reference:https://mochajs.org/#nodejs-native-esm-support. Mocha supports writing tests as ES modules, not just using CommonJS. Edit the test file: test/province.js, modified to import assert fromassert;
import {Province} from '../4/modules/province.js';
import assert from 'assert';
function sampleProvinceData() {
return {
name: "Asia",
producers: [{name: "Byzantium", cost: 10, production: 9}, {
name: "Attalia",
cost: 12,
production: 10
}, {name: "Sinope", cost: 10, production: 6},],
demand: 30,
price: 20
};
}
describe('province', function () {
it('shortfall', function () {
const asia = new Province(sampleProvinceData());
assert.equal(asia.shortfall, 5);
});
});
14. Run the test again and the test passes. as shown in Figure 8
PS E:\wwwroot\refactoring> npm test
> test
> mocha
province
√ shortfall
1 passing (33ms)







