TypeScript2.1+mocha+power-assertでテストしようとして苦戦した話

TypeScript初心者です。
Node.jsで開発して規模が大きくなってくると型が恋しくなってきますね。TypeScriptはVisual Studio Codeでの補完も効くし、コンパイラがくだらないミスを教えてくれるのでうっかりさんには嬉しいです。

しかし、素のNode.jsで使っていたツール達がそのまま使えないのがネックです。
Node.jsで使用していたmocha, power-assertをTypeScript@2.1.5で使うまでにえらく苦労したのでその軌跡です。

## 前提

JavaScriptはブラウザで動くフロントエンドの話と、サーバーサイドのNode.jsの話が混在していて情報が錯綜しやすいのですが、本稿はサーバーサイドのNode.jsに関する話です。

```text:ディレクトリ構成
.
├── dist
├── node_modules
├── package.json
├── src
│   └── index.ts
├── test
│   ├── index.test.ts
│   └── mocha.opts
└── tsconfig.json
```

```json:tsconfig.json
{
  "compileOnSave": true,
  "compilerOptions": {
    "outDir": "./dist",
    "target": "es5",
    "module": "commonjs",
    "sourceMap": true,
    "lib": [
      "es2015",
      "es2015.promise"
    ],
    "types": [
      "node"
    ],
    "allowJs": true,
    "noImplicitAny": true,
    "strictNullChecks": true
  },
  "include": [
    "./src/**/*.ts"
  ]
}
```

## mochaのテストケースをTypeScriptで書くにはどうしたら良いのだろう

プロダクションコードがTypeScriptならテストコードもTypeScriptで書きたくなるのは当然。
その場合、tscで`test/**`もトランスパイルして、出来たJSをmochaで実行するの？

いいえ違いました。mochaを実行するときに`--compilers`オプションを指定することでテスト実行前にプリコンパイルする機構がmochaにありました。

```shell-session
mocha --compilers ts:ts-node/register test/**/*.ts
mocha --compilers ts:espower-typescript/guess test/**/*.ts
```

このように任意のコンパイラを指定できるようです。

ここでは[espower-typescript](https://github.com/power-assert-js/espower-typescript#zero-config-mode)を使用します。

## describe, itが見つからない

```
test/index.test.ts (2,24): Could not find a declaration file for module 'mocha'. '/home/newgyu/Desktop/typescript-mocha-power-assert/node_modules/mocha/index.js' implicitly has an 'any' type. (7016)
test/index.test.ts (6,1): Cannot find name 'describe'. (2304)
test/index.test.ts (7,3): Cannot find name 'it'. (2304)
```

まず、`npm install -D @types/mocha`でmochaの型定義を入れます。

そして、テストコードに

```ts
import * as mocha from "mocha";
```

を追加します。

## power-assertでassertする

**このセクションに書かれた問題は[espower-typescript](https://github.com/power-assert-js/espower-typescript)が普通に使えるようになり解消されました。** 
理由はよくわかりません...


ts-nodeだけだとpower-assertの旨味である**失敗時の詳細なレポート**が表示されません。

```
  1) test of hogehoge case fugafuga:

      AssertionError: false == true
      + expected - actual

      -false
      +true
      
      at Decorator._callFunc (node_modules/empower-core/lib/decorator.js:110:20)
      at Decorator.concreteAssert (node_modules/empower-core/lib/decorator.js:103:17)
      at decoratedAssert (node_modules/empower-core/lib/decorate.js:51:30)
      at powerAssert (node_modules/empower-core/index.js:63:32)
      at Context.<anonymous> (test/index.test.ts:8:5)

```

ただのassertとか変わらない結果になってしまいます。

そこでTypeScriptとpower-assertを組み合わせる手段として[powerassertの公式](https://github.com/power-assert-js/power-assert/blob/master/README.md)では[espower-typescript](https://github.com/power-assert-js/espower-typescript)の使用が推奨されるようですが、~~どうもうまく動きません。~~

```
TypeError: Cannot read property 'text' of undefined
```

~~こんなの出ちゃうんですよね。ここに関してはよくわからず[Issueを上げました](https://github.com/teppeis/typescript-simple/issues/68)。~~

~~ひとまずは**espower-typescript**の使用を諦めて、[espower-ts-node](https://github.com/tracecomms/espower-ts-node)を使うことにします。~~

```shell-session
$ npm i -D espower-ts-node
```

```shell-session
$ mochamocha --compilers ts:ts-node/register test/**/*.ts --require espower-ts-node
```

## で、出来たのがこんなのです

https://github.com/NewGyu/typescript-mocha-power-assert