自作した拡張機能でテストコ-ドのカバレッジを確認したら 0% になってた件を、最新版の VSCode でも動作させる方法。
対応方法
istanbule のコマンドラインインタ-フェ-スである nyc をコマンド呼び出しするのではなく、テストランナ-スクリプトで呼び出すように組み込む。
(゚Д゚)ハァ?
と思う人もいるでしょう、私も思った。
でも残念ながらそれしかないようです。
ちなみに参考にしたのはこちら。
具体的にはテストランナ-スクリプトで nyc インスタンスを生成する。
生成してインストゥルメントしてテストが完了したらレポ-ト生成メソッドを呼び出す。
…楽勝だな !
index.ts
/* eslint @typescript-eslint/naming-convention: "off" */
import * as path from 'path';
import * as Mocha from 'mocha';
import * as glob from 'glob';
const NYC = require('nyc');
const baseConfig = require('@istanbuljs/nyc-config-typescript');
function getNycInstance(): typeof NYC {
const nyc = new NYC({
...baseConfig,
cwd: path.join(__dirname, '..', '..', '..' ),
reporter: ['text-summary', 'lcov', 'html'],
all: true,
silent: false,
instrument: true,
hookRequire: true,
hookRunInContext: true,
hookRunInThisContext: true,
sourceMap: true,
include: ['src/**/*.ts', 'out/**/*.js'],
exclude: ['**/test/*'],
});
nyc.reset();
nyc.wrap();
return nyc;
}
export async function run(): Promise<void> {
const testsRoot = path.resolve(__dirname, '..');
// Sets the test coverage
const nyc = '1' === process.env['COVERAGE'] ? getNycInstance() : undefined;
// Create the mocha test
const mocha = new Mocha({
ui: 'tdd',
color: true
});
// Backup of settings.json and clear
const { ExtensionSetting } = require('../../includes/settings/extension');
const backup = new ExtensionSetting();
await new ExtensionSetting().uninstall();
return new Promise((c, e) => {
glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
if (err) {
return e(err);
}
// Add files to the test suite
files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
try {
// Run the mocha test
mocha.run(async failures => {
await backup.commit();
if (failures > 0) {
e(new Error(`${failures} tests failed.`));
} else {
if (nyc) {
nyc.writeCoverageFile();
await nyc.report();
}
c();
}
});
} catch (err) {
console.error(err);
e(err);
}
});
});
}
上の例は個人的に開発している拡張機能で、settings.json のバックアップが仕込んであるので分かりづらいかも。
結論だけ言えば、getNycInstance メソッドを呼び出してテスト正常終了時に writeCoverageFile メソッドと report メソッドを呼ぶだけ。
ちなみに nyc は istanbule のコマンドラインインタ-フェ-スだからプログラム的に呼び出すのは想定されていないらしく情報はほとんどない。つまりいつまで出来るかは(ry