语音规则引擎 3.2 中的行为变化?

Behavior change in speech-rule-engine 3.2?

我正在使用 speech-rule-engine 从 MathML 生成英文文本。尝试从 v3.1.1 升级到 v3.2.0 时,我看到测试失败,原因我不明白。

我创建了一个简单的两个文件项目来说明这个问题:

package.json

{
  "name": "failure-example",
  "license": "UNLICENSED",
  "private": true,
  "engines": {
    "node": "14.15.5",
    "npm": "6.14.11"
  },
  "scripts": {
    "test": "jest"
  },
  "dependencies": {
    "speech-rule-engine": "3.2.0"
  },
  "devDependencies": {
    "jest": "^26.6.3"
  },
  "jest": {
    "notify": false,
    "silent": true,
    "verbose": true
  }
}

example.test.js

const sre = require('speech-rule-engine');

beforeAll(() => {
    sre.setupEngine({
        domain: 'mathspeak'
    });
});

test('simple single math', () => {
    expect(JSON.parse(JSON.stringify(sre.engineSetup(), ['domain', 'locale', 'speech', 'style'])))
        .toEqual({
            locale: 'en',
            speech: 'none',
            style: 'default',
            domain: 'mathspeak',
        });
    expect(sre.engineReady())
        .toBeTruthy();
    expect(sre.toSpeech('<math><mrow><msup><mn>3</mn><mn>7</mn></msup></mrow></math>'))
        .toBe('3 Superscript 7');
});

运行 npm installnpm run test 导致失败,因为 SRE 返回 37 而不是 3 上标 7 。编辑 package.json 以使用引擎的 v3.1.1 并重新运行结果通过测试。

显然有些事情发生了变化,但我完全不知道我需要做些什么来适应。有没有其他人遇到过这个,或者看到我清楚没有?

在 SRE 维护者的帮助下,问题已解决。问题不在 3.2.0,而是那个 jest 没有等到 sre 就绪。由于规则被编译到核心中,测试在 3.1.1 中只是侥幸正确。以下测试在 3.1.1 中使用上述设置失败,并且未加载语言环境:

expect(sre.toSpeech('<math><mo>=</mo></math>'))
        .toBe('equals');
    Expected: "equals"
    Received: "="

主要原因是jest加载locale文件失败。设置"silent": false会显示错误:

 Unable to load file: /tmp/tests/node_modules/speech-rule-engine/lib/mathmaps/en.js
      TypeError: Cannot read property 'readFileSync' of null

这个错误的原因是jest不知道它运行在node.js中。添加:

    "testEnvironment": "node",

package.json 中的开玩笑配置会导致预期的行为。