我正在研究使用TypeScript进行TDD的可能性。
如果我用TypeScript编写测试,是否可以使import语句返回被测类的模拟?
还是用纯JavaScript编写测试并自行处理AMD的唯一​​可行方法?

最佳答案

我开发了一个名为InversifyJS的IoC容器,该容器具有高级绑定(bind)注入(inject)功能(如上下文绑定(bind))。

您需要遵循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.声明绑定(bind)

绑定(bind)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)支持许多用例:
  • 内核模块
  • 内核中间件
  • 使用类,字符串文字或符号作为依赖项标识符
  • 注入(inject)常量
  • 注入(inject)类构造函数
  • 注入(inject)工厂
  • 汽车工厂
  • 注入(inject)提供程序(异步工厂)
  • 激活处理程序(用于注入(inject)代理)
  • 多次注入(inject)
  • 标记的绑定(bind)
  • 自定义标签装饰器
  • 命名绑定(bind)
  • 上下文绑定(bind)
  • 友好的异常(例如循环依赖)

  • 您可以通过https://github.com/inversify/InversifyJS了解更多信息

    10-07 19:12
    查看更多