I'm looking into the possibilities to do TDD with TypeScript. If I write my tests in TypeScript, is it possible to make the import statements return mocks for my class under test? Or is the only feasible approach to write the tests in pure javascript and deal with injecting AMDs myself?
Dependency injection (DI): a variant of IoC in which objects receive other objects as dependencies instead of constructors or setters. Decorators: functions that enable composition and are wrappable around classes, functions, methods, accessors, properties, and parameters.
The D letter in SOLID is the Dependency Inversion principle. It helps to decouple modules from each other so that you can easily swap one part of the code for another. One of the techniques that helps to follow this principle is Dependency Injection.
Dependency injection, or DI, is one of the fundamental concepts in Angular. DI is wired into the Angular framework and allows classes with Angular decorators, such as Components, Directives, Pipes, and Injectables, to configure dependencies that they need.
I have developed an IoC container called InversifyJS with advanced dependency injection features like contextual bindings.
You need to follow 3 basic steps to use it:
The annotation API is based on 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(); }; }
The binding API is based on 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;
The resolution API is based on Ninject:
import kernel = from "./inversify.config"; var ninja = kernel.get<INinja>("INinja"); expect(ninja.fight()).eql("cut!"); // true expect(ninja.sneak()).eql("hit!"); // true
The latest release (2.0.0) supports many use cases:
You can learn more about it at https://github.com/inversify/InversifyJS
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With