在 重构:改善既有代码的设计 (第2版) 中,基于 Mocha 运行测试用例

1、在 Githab 中搜索:Mocha,选择第一个:mochajs/mocha,用于 node.js 和浏览器的简单、灵活、有趣的 javascript 测试框架。如图1

图1

2、点击链接 Documentation ,进入 https://mochajs.org/

3、参考安装:https://mochajs.org/#installation ,作为项目的开发依赖项,使用 npm 安装,进入项目目录:npm install –save-dev mocha。如图2

图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、参考:https://mochajs.org/#getting-started。运行:./node_modules/mocha/bin/mocha,报错:Windows Script Host,脚本:E:\wwwroot\refactoring\node_modules\mocha\bin\mocha.js,错误:无效字符。如图3

图3

5、在 package.json 中设置测试脚本:

{
  "devDependencies": {
    "mocha": "^10.2.0"
  },
  "scripts": {
    "test": "mocha"
  }
}

6、然后运行测试:npm test,运行正常。如图4

图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、删除文件:test/test.js,新建测试文件: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、运行测试报错:(node:5740) Warning: To load an ES module, set “type”: “module” in the package.json or use the .mjs extension.。如图5

图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.<anonymous> (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、编辑 package.json,添加 “type”: “module”

{
  "devDependencies": {
    "mocha": "^10.2.0"
  },
  "scripts": {
    "test": "mocha"
  },
  "type": "module"
}

10、再次运行测试,报错:ReferenceError: assert is not defined。如图6

图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.<anonymous> (file:///E:/wwwroot/refactoring/test/province.js:19:9)
      at process.processImmediate (node:internal/timers:471:21)



11、编辑测试文件:test/province.js,添加 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、再次运行测试,报错:ReferenceError: require 未在 ES 模块范围内定义,你可以改用导入。如图7

图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、参考:https://mochajs.org/#nodejs-native-esm-support 。Mocha 支持将测试编写为 ES 模块,而不仅仅是使用 CommonJS。编辑测试文件:test/province.js,修改为 import assert from ‘assert’;

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、再次运行测试,测试通过。如图8

图8

PS E:\wwwroot\refactoring> npm test

> test
> mocha



  province
    √ shortfall


  1 passing (33ms)
永夜