TypeScript で TDD を実行する可能性を検討しています。テストを TypeScript で記述した場合、インポート ステートメントがテスト対象のクラスのモックを返すようにすることは可能ですか? それとも、純粋な JavaScript でテストを記述し、AMD の注入を自分で処理する唯一の実行可能なアプローチですか?
9 に答える
コンテキスト バインディングなどの高度な依存性注入機能を備えた InversifyJS という IoC コンテナーを開発しました。
使用するには、次の3 つの基本的な手順に従う必要があります。
1. 注釈を追加する
注釈 API は Angular 2.0 に基づいています。
import { injectable, inject } from "inversify";
@injectable()
class Katana implements IKatana {
public hit() {
return "cut!";
}
}
@injectable()
class Shuriken implements IShuriken {
public throw() {
return "hit!";
}
}
@injectable()
class Ninja implements INinja {
private _katana: IKatana;
private _shuriken: IShuriken;
public constructor(
@inject("IKatana") katana: IKatana,
@inject("IShuriken") shuriken: IShuriken
) {
this._katana = katana;
this._shuriken = shuriken;
}
public fight() { return this._katana.hit(); };
public sneak() { return this._shuriken.throw(); };
}
2.バインディングを宣言する
バインディング API は Ninject に基づいています。
import { Kernel } from "inversify";
import { Ninja } from "./entities/ninja";
import { Katana } from "./entities/katana";
import { Shuriken} from "./entities/shuriken";
var kernel = new Kernel();
kernel.bind<INinja>("INinja").to(Ninja);
kernel.bind<IKatana>("IKatana").to(Katana);
kernel.bind<IShuriken>("IShuriken").to(Shuriken);
export default kernel;
3.依存関係を解決する
解決 API は Ninject に基づいています。
import kernel = from "./inversify.config";
var ninja = kernel.get<INinja>("INinja");
expect(ninja.fight()).eql("cut!"); // true
expect(ninja.sneak()).eql("hit!"); // true
最新リリース (2.0.0) は、多くのユース ケースをサポートしています。
- カーネル モジュール
- カーネルミドルウェア
- クラス、文字列リテラル、またはシンボルを依存関係識別子として使用する
- 定数値の注入
- クラス コンストラクターの注入
- 工場の注入
- 自動車工場
- プロバイダーの注入 (非同期ファクトリー)
- アクティベーション ハンドラ (プロキシの挿入に使用)
- マルチインジェクション
- タグ付きバインディング
- カスタムタグデコレータ
- 名前付きバインディング
- コンテキスト バインディング
- 友好的な例外 (循環依存関係など)
TypeScript は、requirejs などの AMD ローダーとうまく連携します。適切に構成されている場合、TypeScript は AMD に完全に準拠した JavaScript を出力します。
テスト状況では、テスト可能なモジュールを挿入するように requirejs を構成できます。
AutoFixture にインスパイアされた AutoFixtureTS に取り組んでいます。AutoFixtureTS は、関連性のないテスト フィクスチャのセットアップを自動化することで、TypeScript 開発者がテスト駆動開発を容易に行えるようにし、テスト開発者が各テスト ケースの本質に集中できるようにします。
http://ronniehegelund.github.io/AutoFixtureTS/
まだプロトタイプ コードですが、チェックしてみてください :-)
/ロニー