SlideShare a Scribd company logo
1 of 39
Download to read offline
Angular2-rc.1
Unit testing Overview
2016/05/17 mg-mtg#7
Mitsuru Ogawa(@mitsuruog)
Who am I?
- 小川 充(@mitsuruog)
- Front-end engineer@Givery
- works
- Angular1.4
- ユニットテスト、E2Eテスト
- フロントエンドのCI
Today’s motivation and goal
− Motivation
 - Release Candidateが近いので、そろそろテストを書くノウハウが必要
 - Angular1のテスト資産をどうするべきか、が心配になってきた
- Goal
 - Angular2でのテストについての概要を知る
 - Angular1のテスト資産の戦略的生かし方
Table contents
1. Angular2ユニットテストの基本
1.1. ツールとセットアップ
1.2. Pipeのテスト
1.3. Serviceのテスト
1.4. Componentのテスト
2. Angular1からの変更点
3. 最近のアップデート情報
4. Angular1テスト資産の生存戦略
以前話した内容の拡大版です
http://goo.gl/1SpphI
1.Angular2
ユニットテストの基本
ツールとセットアップ
- Typescript
- Karma
- Jasmine
- SystemJS
Karma
SystemJS(モジュールローダー)
SpecApplication
Karma.conf.js =>
Karma-test.shim.js =>
Angular2ユニットテストスタック
Pipeのテスト
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({
name: 'sayHello'
})
export class SayHelloPipe implements PipeTransform {
transform(value:string):string {
return `Hello ${value}`;
}
}
Pipeのテスト
import { describe, it, expect, beforeEach } from '@angular/testing';
import { SayHelloPipe } from './say-hello.pipe';
テストで利用するモジュールをimportする
Pipeのテスト
import { describe, it, expect, beforeEach } from '@angular/testing';
import { SayHelloPipe } from './say-hello.pipe';
describe('Test: SayHelloPipe', () => {
let testee;
beforeEach(() => {
testee = new SayHelloPipe();
});
});
インスタンスを取得する
Pipeのテスト
import { describe, it, expect, beforeEach } from '@angular/testing';
import { SayHelloPipe } from './say-hello.pipe';
describe('Test: SayHelloPipe', () => {
let testee;
beforeEach(() => {
testee = new SayHelloPipe();
});
it('should say hello', () => {
expect(testee.transform('world')).toEqual('Hello world');
});
});
テストを実行して結果を比較する
Serviceのテスト
import {Injectable} from "@angular/core";
@Injectable()
export class SayHelloService {
constructor() {}
say():string {
return 'Hello';
}
}
Serviceのテスト
import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing';
import {SayHelloService} from "./say-hello.service";
テストで利用するモジュールをimportする
Serviceのテスト
import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing';
import {SayHelloService} from "./say-hello.service";
describe('Test: SayHelloService', () => {
beforeEachProviders(() => [
SayHelloService
]);
});
後でServiceをDIする際に利用するprovidorを指
定する。
(何もOverrideせずそのまま利用する設定)
Serviceのテスト
import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing';
import {SayHelloService} from "./say-hello.service";
describe('Test: SayHelloService', () => {
beforeEachProviders(() => [
SayHelloService
]);
it('Should say Hello', inject([SayHelloService], (testee:SayHelloService) => {
}));
});
injectでテストコンテキストにserviceをDIする
Serviceのテスト
import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing';
import {SayHelloService} from "./say-hello.service";
describe('Test: SayHelloService', () => {
beforeEachProviders(() => [
SayHelloService
]);
it('Should say Hello', inject([SayHelloService], (testee:SayHelloService) => {
expect(testee.say()).toEqual('Hello');
}));
});
テストを実行して結果を比較する
Serviceのテスト
import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing';
import {SayHelloService} from "./say-hello.service";
import {provide} from "@angular/core";
import {SayHelloServiceMock} from "./say-hello.service.mock";
describe('Test: SayHelloService', () => {
beforeEachProviders(() => [
provide(SayHelloService, { useClass: SayHelloServiceMock })
]);
});
providorを書き換えることで、Serviceを
Overrideすることもできる
(SayHelloServiceMockでOverrideしている)
BONUS
Componentのテスト
import {Component, OnInit} from "@angular/core";
import {SayHelloService} from "./say-hello.service";
@Component({
selector: 'say-hello',
template: '<div>Hello</div>',
providers: [SayHelloService]
})
export class SayHelloComponent implements OnInit {
constructor(private service:SayHelloService) {}
ngOnInit() {
console.log(this.service.say());
}
}
Componentのテスト①
import { describe, it, inject, async, expect, beforeEachProviders } from '@angular/core/testing';
import { TestComponentBuilder, ComponentFixture } from '@angular/compiler/testing';
import { Component } from '@angular/core';
import { SayHelloComponent } from './say-hello.component';
テストで利用するモジュールをimportする
Componentのテスト①
import { describe, it, inject, async, expect, beforeEachProviders } from '@angular/core/testing';
import { TestComponentBuilder, ComponentFixture } from '@angular/compiler/testing';
import { Component } from '@angular/core';
import { SayHelloComponent } from './say-hello.component';
@Component({
selector: 'test-container',
template: '<say-hello></say-hello>',
directives: [SayHelloComponent]
})
class TestComponent {}
テストfixtureを作成する
Componentのテスト②
describe('Test: SayHelloComponent', () => {
let builder;
beforeEach(inject([TestComponentBuilder], (tcb) => {
builder = tcb;
}));
});
TestComponentBuilderを初期化して
Cacheしておく
Componentのテスト②
describe('Test: SayHelloComponent', () => {
let builder;
beforeEach(inject([TestComponentBuilder], (tcb) => {
builder = tcb;
}));
it('Should display Hello', async(() => {
return builder.createAsync(TestComponent)
.then((fixture: ComponentFixture<TestComponent>) => {
});
}));
});
TestComponentを初期化してfixtureを取得する
Componentのテスト②
describe('Test: SayHelloComponent', () => {
let builder;
beforeEach(inject([TestComponentBuilder], (tcb) => {
builder = tcb;
}));
it('Should display Hello', async(() => {
return builder.createAsync(TestComponent)
.then((fixture: ComponentFixture<TestComponent>) => {
let div = fixture.nativeElement.querySelector('div');
expect(div).toHaveText('Hello');
});
}));
});
fixtureからHTML Elementを取得して
結果を比較する
Componentのテスト②
describe('Test: SayHelloComponent', () => {
let builder;
beforeEach(inject([TestComponentBuilder], (tcb) => {
builder = tcb;
}));
it('Should display Hello', async(() => {
let template = '<say-hello></say-hello>';
return builder.overrideTemplate(TestComponent, template)
.createAsync(TestComponent)
.then((fixture: ComponentFixture<TestComponent>) => {
let div = fixture.nativeElement.querySelector('div');
expect(div).toHaveText('Hello');
});
}));
});
fixtureのtemplateは別のものに切り替え可能で
す
BONUS
2.Angular1
からの変更点
https://goo.gl/lQ4s02
詳しくはこちらへ =>
Angular1からの変更点
- Jasmine
- describe, it, matcher, spy, mock …
- Dependency injection => inject
- 注入方法:_moduleName_の奇妙なルール
- HttpMock => $httpbackend
- TestFixtureの作成 =>$compile
- 変更検知
- digestループ
- scope.$digest()
- モジュールのロード
- module
- モジュールの書き換え
- $provide
- Jasmine
- 独自拡張したngMatcherが存在
- Dependency injection => inject
- 注入方法:Typescriptによる型
- HttpMock => MockBackend
- TestFixtureの作成 => TestComponentBuilder
- 変更検知
- Change Detection
- fixture.detectChanges()
- モジュールのロード
- import
- モジュールの書き換え
- beforeEachProviders
Angular1からの変更点
- Jasmine
- describe, it, matcher, spy, mock …
- Dependency injection => inject
- 注入方法:_moduleName_の奇妙なルール
- HttpMock => $httpbackend
- TestFixtureの作成 =>$compile
- 変更検知
- digestループ
- scope.$digest()
- モジュールのロード
- module
- モジュールの書き換え
- $provide
- Jasmine
- 独自拡張したngMatcherが存在
- Dependency injection => inject
- 注入方法:Typescriptによる型
- HttpMock => MockBackend
- TestFixtureの作成 => TestComponentBuilder
- 変更検知
- Change Detection
- fixture.detectChanges()
- モジュールのロード
- import
- モジュールの書き換え
- beforeEachProviders
小
さ
い
大
き
い
3.最近のアップデート
(テスト周辺)
https://www.ng-conf.org
- @angular/core/testing
- describe, it, inject, etc…
- @angular/compiler/testing
- TestComponentBuilder
- @angular/platform-browser/testing
パッケージ名の変更
- angular2/testing
- describe, it, inject, etc...
- TestComponentBuilder
- angular2/platform/testing/browser
RCBeta.17
Test APIの改善
- 非同期処理、変更検知が格段に良くなった
- [RC] injectAsync => async
- [Bata.16] autoDetectChanges() の導入
- 詳しくはJulie Ralphのプレゼンをチェック
- Zone.js!!Zone.js!!Zone.js!!
Testing you Tasks: Julie Ralph
https://youtu.be/DltUEDy7ItY
4.Angular1
テスト資産の生存戦略
基本方針
- 移行ではなく「移植」
- 残せるものを残す。残せる部分を増やす。
- 厳しい冬を想定したテストコードの剪定。
- Viewに依存しない「純粋なロジック」のみを移植
- ViewはComponentで書き直すケースが多くなる。
- Directiveに代表されるComponentとして再利用できるものは移植 OK。
ユニットテストコード移植パス
filter pipe
providor, service, factory service
directive
controller
directive
ユニットテストコード移植パス
filter pipe
providor, service, factory service
directive
controller
directive
Controllerテストコード生存戦略
- Controller Helper Service パターン
- 純粋なロジックをController Helper Serviceに移動、これを将来移植する
- 既存のテストコードは Controller Helper Service に適用しておく
angular.module('app')
.controller('AppController', function() {
var vm = this;
this.doSomething = function () {
// 何か移植する価値がありそうなロジック
};
});
angular.module('app')
.controller('AppController', function(AppControllerHelper) {
var vm = this;
this.doSomething = AppControllerHelper.doSomething;
});
angular.module('app')
.factory('AppControllerHelper', function() {
return {
doSomething: function () {
// 何か移植する価値がありそうなロジック
};
});
Controllerテストコード移植パス
Controller
ControllerHelper Service
Component
ロジックを分離
移植パス
注入(DI)
移行
移植
Controllerテストコード移植パス
移植パス
注入(DI)
Controller
ControllerHelper Service
Component
テスト
テスト
テスト
移行
テスト
新規作成
ロジック部分を移植
まとめ
まとめ
- ユニットテストに関するAngular1の知見は再利用できる
- Typescriptとzone.jsによりテストコードが書きやすくなっている
- Angular1のテスト資産は「移植」する心意気で
- 特にControllerのテストコードは注意!!
参考リンク
- Angular 2 unit testing overview
- http://www.slideshare.net/mitsuruogawa33/angular-2-unit-testing-overview
- Angular 1 to 2 Quick Reference In unit testing
- https://gist.github.com/mitsuruog/9e3e5c2c5d17a15a4c2a
- Testing you Tasks: Julie Ralph
- https://youtu.be/DltUEDy7ItY
- mitsuruog/_angular2-unit-test-sample
- https://github.com/mitsuruog/_angular2-unit-test-sample
- mitsuruog/angular2-minimum-starter: Minimum starter kit for angular2
- https://github.com/mitsuruog/angular2-minimum-starter
- I am mitsuruog - Angular2 unit test
- https://goo.gl/3ypfaH

More Related Content

What's hot

[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部haruki ueno
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
LaravelとテストについてTakeo Noda
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
Vue.js 3.0で搭載される Composition APIをざっくりと
Vue.js 3.0で搭載される Composition APIをざっくりとVue.js 3.0で搭載される Composition APIをざっくりと
Vue.js 3.0で搭載される Composition APIをざっくりとYuichirouWakugami
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証についてTakeo Noda
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」Hiroyuki Ohnaka
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編なべ
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugToshiaki Maki
 
[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回Yukiko Kato
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~UnityTechnologiesJapan002
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
 

What's hot (16)

[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
 
Firefoxosハンズオン
FirefoxosハンズオンFirefoxosハンズオン
Firefoxosハンズオン
 
AngularJS入門
AngularJS入門AngularJS入門
AngularJS入門
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
Laravelとテストについて
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
Vue.js 3.0で搭載される Composition APIをざっくりと
Vue.js 3.0で搭載される Composition APIをざっくりとVue.js 3.0で搭載される Composition APIをざっくりと
Vue.js 3.0で搭載される Composition APIをざっくりと
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証について
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
 
[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回[Ps11]ネットワーク第4回
[Ps11]ネットワーク第4回
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 

Viewers also liked

Angular testing
Angular testingAngular testing
Angular testingYu Jin
 
Testing Angular 2 Applications - Rich Web 2016
Testing Angular 2 Applications - Rich Web 2016Testing Angular 2 Applications - Rich Web 2016
Testing Angular 2 Applications - Rich Web 2016Matt Raible
 
Colorado’s Skiing Opportunities
Colorado’s Skiing Opportunities Colorado’s Skiing Opportunities
Colorado’s Skiing Opportunities Scott Gelbard
 
Unusual Picture Show
Unusual Picture ShowUnusual Picture Show
Unusual Picture ShowMarco Belzoni
 
Presentation for business [offical edition]
Presentation for business [offical edition] Presentation for business [offical edition]
Presentation for business [offical edition] Woanchyin Chew
 
Xp祭りに行ってきた
Xp祭りに行ってきたXp祭りに行ってきた
Xp祭りに行ってきたAkira Suenami
 
Presentation for audiences
Presentation for audiencesPresentation for audiences
Presentation for audiencesCPugh2005
 
Felt - Front end load testing
Felt - Front end load testingFelt - Front end load testing
Felt - Front end load testingSamuel Vandamme
 
Planificacion de la Producción en industrias de alimentos
Planificacion de la Producción en industrias de alimentosPlanificacion de la Producción en industrias de alimentos
Planificacion de la Producción en industrias de alimentosDiana Coello
 
Midem Workshop 2010
Midem Workshop 2010Midem Workshop 2010
Midem Workshop 2010kluger
 

Viewers also liked (12)

pick up ng-conf
pick up ng-confpick up ng-conf
pick up ng-conf
 
Angular testing
Angular testingAngular testing
Angular testing
 
Testing Angular 2 Applications - Rich Web 2016
Testing Angular 2 Applications - Rich Web 2016Testing Angular 2 Applications - Rich Web 2016
Testing Angular 2 Applications - Rich Web 2016
 
Colorado’s Skiing Opportunities
Colorado’s Skiing Opportunities Colorado’s Skiing Opportunities
Colorado’s Skiing Opportunities
 
Unusual Picture Show
Unusual Picture ShowUnusual Picture Show
Unusual Picture Show
 
Presentation for business [offical edition]
Presentation for business [offical edition] Presentation for business [offical edition]
Presentation for business [offical edition]
 
Xp祭りに行ってきた
Xp祭りに行ってきたXp祭りに行ってきた
Xp祭りに行ってきた
 
Xoxoliiis
XoxoliiisXoxoliiis
Xoxoliiis
 
Presentation for audiences
Presentation for audiencesPresentation for audiences
Presentation for audiences
 
Felt - Front end load testing
Felt - Front end load testingFelt - Front end load testing
Felt - Front end load testing
 
Planificacion de la Producción en industrias de alimentos
Planificacion de la Producción en industrias de alimentosPlanificacion de la Producción en industrias de alimentos
Planificacion de la Producción en industrias de alimentos
 
Midem Workshop 2010
Midem Workshop 2010Midem Workshop 2010
Midem Workshop 2010
 

Similar to Angular2 rc.1 unit testing overview

エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~MakotoItoh
 
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるアップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるBrian Gesiak
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷JavaToshiaki Maki
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Daizen Ikehara
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
Azure load testingを利用したパフォーマンステスト
Azure load testingを利用したパフォーマンステストAzure load testingを利用したパフォーマンステスト
Azure load testingを利用したパフォーマンステストKuniteru Asami
 
Spring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web ServiceSpring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web ServiceWataruOhno
 
AppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころAppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころMasayuki Wakizaka
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revWindows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revShotaro Suzuki
 

Similar to Angular2 rc.1 unit testing overview (20)

エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
PHP勉強会 #51
PHP勉強会 #51PHP勉強会 #51
PHP勉強会 #51
 
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
 
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるアップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられる
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Azure load testingを利用したパフォーマンステスト
Azure load testingを利用したパフォーマンステストAzure load testingを利用したパフォーマンステスト
Azure load testingを利用したパフォーマンステスト
 
Spring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web ServiceSpring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web Service
 
AppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころAppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころ
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revWindows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
 
ASP.NET MVC 1.0
ASP.NET MVC 1.0ASP.NET MVC 1.0
ASP.NET MVC 1.0
 

More from Mitsuru Ogawa

React+TypeScriptもいいぞ
React+TypeScriptもいいぞReact+TypeScriptもいいぞ
React+TypeScriptもいいぞMitsuru Ogawa
 
Webアプリケーションセキュリティ ディスカッション資料
Webアプリケーションセキュリティ ディスカッション資料Webアプリケーションセキュリティ ディスカッション資料
Webアプリケーションセキュリティ ディスカッション資料Mitsuru Ogawa
 
Lightningコンポーネント事始め
Lightningコンポーネント事始めLightningコンポーネント事始め
Lightningコンポーネント事始めMitsuru Ogawa
 
ゆるふわWoT&firefoxOS体験記
ゆるふわWoT&firefoxOS体験記ゆるふわWoT&firefoxOS体験記
ゆるふわWoT&firefoxOS体験記Mitsuru Ogawa
 
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)Mitsuru Ogawa
 
今後のWeb開発の未来を考えてangularJSにしました
今後のWeb開発の未来を考えてangularJSにしました今後のWeb開発の未来を考えてangularJSにしました
今後のWeb開発の未来を考えてangularJSにしましたMitsuru Ogawa
 
エンタープライヤーのためのWeb Componentsハンズオン
エンタープライヤーのためのWeb ComponentsハンズオンエンタープライヤーのためのWeb Componentsハンズオン
エンタープライヤーのためのWeb ComponentsハンズオンMitsuru Ogawa
 
エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜
エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜
エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜Mitsuru Ogawa
 
国内初事例に学ぶSAPUI5
国内初事例に学ぶSAPUI5国内初事例に学ぶSAPUI5
国内初事例に学ぶSAPUI5Mitsuru Ogawa
 
35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略
35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略
35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略Mitsuru Ogawa
 
賢くツールを使って脱人海戦術駆動テスト
賢くツールを使って脱人海戦術駆動テスト賢くツールを使って脱人海戦術駆動テスト
賢くツールを使って脱人海戦術駆動テストMitsuru Ogawa
 
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことメンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことMitsuru Ogawa
 
HTML5とOSSで作るブラウザで簡単顔認識
HTML5とOSSで作るブラウザで簡単顔認識HTML5とOSSで作るブラウザで簡単顔認識
HTML5とOSSで作るブラウザで簡単顔認識Mitsuru Ogawa
 
業務系WebアプリケーションがStrutsから旅立つ日
業務系WebアプリケーションがStrutsから旅立つ日業務系WebアプリケーションがStrutsから旅立つ日
業務系WebアプリケーションがStrutsから旅立つ日Mitsuru Ogawa
 
これからフロントエンジニアを目指すあなたへ
これからフロントエンジニアを目指すあなたへこれからフロントエンジニアを目指すあなたへ
これからフロントエンジニアを目指すあなたへMitsuru Ogawa
 
オフラインWeb 今どきのデータ永続化事情
オフラインWeb 今どきのデータ永続化事情オフラインWeb 今どきのデータ永続化事情
オフラインWeb 今どきのデータ永続化事情Mitsuru Ogawa
 
Enja OSSやってます
Enja OSSやってますEnja OSSやってます
Enja OSSやってますMitsuru Ogawa
 

More from Mitsuru Ogawa (18)

React+TypeScriptもいいぞ
React+TypeScriptもいいぞReact+TypeScriptもいいぞ
React+TypeScriptもいいぞ
 
Webアプリケーションセキュリティ ディスカッション資料
Webアプリケーションセキュリティ ディスカッション資料Webアプリケーションセキュリティ ディスカッション資料
Webアプリケーションセキュリティ ディスカッション資料
 
Lightningコンポーネント事始め
Lightningコンポーネント事始めLightningコンポーネント事始め
Lightningコンポーネント事始め
 
ゆるふわWoT&firefoxOS体験記
ゆるふわWoT&firefoxOS体験記ゆるふわWoT&firefoxOS体験記
ゆるふわWoT&firefoxOS体験記
 
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
 
今後のWeb開発の未来を考えてangularJSにしました
今後のWeb開発の未来を考えてangularJSにしました今後のWeb開発の未来を考えてangularJSにしました
今後のWeb開発の未来を考えてangularJSにしました
 
エンタープライヤーのためのWeb Componentsハンズオン
エンタープライヤーのためのWeb ComponentsハンズオンエンタープライヤーのためのWeb Componentsハンズオン
エンタープライヤーのためのWeb Componentsハンズオン
 
エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜
エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜
エンタープライズとHTML5〜エンタープライズでHTML5って本当に必要なのか?〜
 
国内初事例に学ぶSAPUI5
国内初事例に学ぶSAPUI5国内初事例に学ぶSAPUI5
国内初事例に学ぶSAPUI5
 
35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略
35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略
35歳無名のシステムエンジニアが1年半でフロントエンジニアになるために行った3つの成長戦略
 
賢くツールを使って脱人海戦術駆動テスト
賢くツールを使って脱人海戦術駆動テスト賢くツールを使って脱人海戦術駆動テスト
賢くツールを使って脱人海戦術駆動テスト
 
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことメンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
 
HTML5とOSSで作るブラウザで簡単顔認識
HTML5とOSSで作るブラウザで簡単顔認識HTML5とOSSで作るブラウザで簡単顔認識
HTML5とOSSで作るブラウザで簡単顔認識
 
業務系WebアプリケーションがStrutsから旅立つ日
業務系WebアプリケーションがStrutsから旅立つ日業務系WebアプリケーションがStrutsから旅立つ日
業務系WebアプリケーションがStrutsから旅立つ日
 
ゆるふわCSS3
ゆるふわCSS3 ゆるふわCSS3
ゆるふわCSS3
 
これからフロントエンジニアを目指すあなたへ
これからフロントエンジニアを目指すあなたへこれからフロントエンジニアを目指すあなたへ
これからフロントエンジニアを目指すあなたへ
 
オフラインWeb 今どきのデータ永続化事情
オフラインWeb 今どきのデータ永続化事情オフラインWeb 今どきのデータ永続化事情
オフラインWeb 今どきのデータ永続化事情
 
Enja OSSやってます
Enja OSSやってますEnja OSSやってます
Enja OSSやってます
 

Angular2 rc.1 unit testing overview

  • 1. Angular2-rc.1 Unit testing Overview 2016/05/17 mg-mtg#7 Mitsuru Ogawa(@mitsuruog)
  • 2. Who am I? - 小川 充(@mitsuruog) - Front-end engineer@Givery - works - Angular1.4 - ユニットテスト、E2Eテスト - フロントエンドのCI
  • 3. Today’s motivation and goal − Motivation  - Release Candidateが近いので、そろそろテストを書くノウハウが必要  - Angular1のテスト資産をどうするべきか、が心配になってきた - Goal  - Angular2でのテストについての概要を知る  - Angular1のテスト資産の戦略的生かし方
  • 4. Table contents 1. Angular2ユニットテストの基本 1.1. ツールとセットアップ 1.2. Pipeのテスト 1.3. Serviceのテスト 1.4. Componentのテスト 2. Angular1からの変更点 3. 最近のアップデート情報 4. Angular1テスト資産の生存戦略 以前話した内容の拡大版です http://goo.gl/1SpphI
  • 6. ツールとセットアップ - Typescript - Karma - Jasmine - SystemJS Karma SystemJS(モジュールローダー) SpecApplication Karma.conf.js => Karma-test.shim.js => Angular2ユニットテストスタック
  • 7. Pipeのテスト import {Pipe, PipeTransform} from '@angular/core'; @Pipe({ name: 'sayHello' }) export class SayHelloPipe implements PipeTransform { transform(value:string):string { return `Hello ${value}`; } }
  • 8. Pipeのテスト import { describe, it, expect, beforeEach } from '@angular/testing'; import { SayHelloPipe } from './say-hello.pipe'; テストで利用するモジュールをimportする
  • 9. Pipeのテスト import { describe, it, expect, beforeEach } from '@angular/testing'; import { SayHelloPipe } from './say-hello.pipe'; describe('Test: SayHelloPipe', () => { let testee; beforeEach(() => { testee = new SayHelloPipe(); }); }); インスタンスを取得する
  • 10. Pipeのテスト import { describe, it, expect, beforeEach } from '@angular/testing'; import { SayHelloPipe } from './say-hello.pipe'; describe('Test: SayHelloPipe', () => { let testee; beforeEach(() => { testee = new SayHelloPipe(); }); it('should say hello', () => { expect(testee.transform('world')).toEqual('Hello world'); }); }); テストを実行して結果を比較する
  • 11. Serviceのテスト import {Injectable} from "@angular/core"; @Injectable() export class SayHelloService { constructor() {} say():string { return 'Hello'; } }
  • 12. Serviceのテスト import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing'; import {SayHelloService} from "./say-hello.service"; テストで利用するモジュールをimportする
  • 13. Serviceのテスト import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing'; import {SayHelloService} from "./say-hello.service"; describe('Test: SayHelloService', () => { beforeEachProviders(() => [ SayHelloService ]); }); 後でServiceをDIする際に利用するprovidorを指 定する。 (何もOverrideせずそのまま利用する設定)
  • 14. Serviceのテスト import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing'; import {SayHelloService} from "./say-hello.service"; describe('Test: SayHelloService', () => { beforeEachProviders(() => [ SayHelloService ]); it('Should say Hello', inject([SayHelloService], (testee:SayHelloService) => { })); }); injectでテストコンテキストにserviceをDIする
  • 15. Serviceのテスト import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing'; import {SayHelloService} from "./say-hello.service"; describe('Test: SayHelloService', () => { beforeEachProviders(() => [ SayHelloService ]); it('Should say Hello', inject([SayHelloService], (testee:SayHelloService) => { expect(testee.say()).toEqual('Hello'); })); }); テストを実行して結果を比較する
  • 16. Serviceのテスト import {describe, it, inject, expect, beforeEachProviders} from '@angular/core/testing'; import {SayHelloService} from "./say-hello.service"; import {provide} from "@angular/core"; import {SayHelloServiceMock} from "./say-hello.service.mock"; describe('Test: SayHelloService', () => { beforeEachProviders(() => [ provide(SayHelloService, { useClass: SayHelloServiceMock }) ]); }); providorを書き換えることで、Serviceを Overrideすることもできる (SayHelloServiceMockでOverrideしている) BONUS
  • 17. Componentのテスト import {Component, OnInit} from "@angular/core"; import {SayHelloService} from "./say-hello.service"; @Component({ selector: 'say-hello', template: '<div>Hello</div>', providers: [SayHelloService] }) export class SayHelloComponent implements OnInit { constructor(private service:SayHelloService) {} ngOnInit() { console.log(this.service.say()); } }
  • 18. Componentのテスト① import { describe, it, inject, async, expect, beforeEachProviders } from '@angular/core/testing'; import { TestComponentBuilder, ComponentFixture } from '@angular/compiler/testing'; import { Component } from '@angular/core'; import { SayHelloComponent } from './say-hello.component'; テストで利用するモジュールをimportする
  • 19. Componentのテスト① import { describe, it, inject, async, expect, beforeEachProviders } from '@angular/core/testing'; import { TestComponentBuilder, ComponentFixture } from '@angular/compiler/testing'; import { Component } from '@angular/core'; import { SayHelloComponent } from './say-hello.component'; @Component({ selector: 'test-container', template: '<say-hello></say-hello>', directives: [SayHelloComponent] }) class TestComponent {} テストfixtureを作成する
  • 20. Componentのテスト② describe('Test: SayHelloComponent', () => { let builder; beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; })); }); TestComponentBuilderを初期化して Cacheしておく
  • 21. Componentのテスト② describe('Test: SayHelloComponent', () => { let builder; beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; })); it('Should display Hello', async(() => { return builder.createAsync(TestComponent) .then((fixture: ComponentFixture<TestComponent>) => { }); })); }); TestComponentを初期化してfixtureを取得する
  • 22. Componentのテスト② describe('Test: SayHelloComponent', () => { let builder; beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; })); it('Should display Hello', async(() => { return builder.createAsync(TestComponent) .then((fixture: ComponentFixture<TestComponent>) => { let div = fixture.nativeElement.querySelector('div'); expect(div).toHaveText('Hello'); }); })); }); fixtureからHTML Elementを取得して 結果を比較する
  • 23. Componentのテスト② describe('Test: SayHelloComponent', () => { let builder; beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; })); it('Should display Hello', async(() => { let template = '<say-hello></say-hello>'; return builder.overrideTemplate(TestComponent, template) .createAsync(TestComponent) .then((fixture: ComponentFixture<TestComponent>) => { let div = fixture.nativeElement.querySelector('div'); expect(div).toHaveText('Hello'); }); })); }); fixtureのtemplateは別のものに切り替え可能で す BONUS
  • 25. Angular1からの変更点 - Jasmine - describe, it, matcher, spy, mock … - Dependency injection => inject - 注入方法:_moduleName_の奇妙なルール - HttpMock => $httpbackend - TestFixtureの作成 =>$compile - 変更検知 - digestループ - scope.$digest() - モジュールのロード - module - モジュールの書き換え - $provide - Jasmine - 独自拡張したngMatcherが存在 - Dependency injection => inject - 注入方法:Typescriptによる型 - HttpMock => MockBackend - TestFixtureの作成 => TestComponentBuilder - 変更検知 - Change Detection - fixture.detectChanges() - モジュールのロード - import - モジュールの書き換え - beforeEachProviders
  • 26. Angular1からの変更点 - Jasmine - describe, it, matcher, spy, mock … - Dependency injection => inject - 注入方法:_moduleName_の奇妙なルール - HttpMock => $httpbackend - TestFixtureの作成 =>$compile - 変更検知 - digestループ - scope.$digest() - モジュールのロード - module - モジュールの書き換え - $provide - Jasmine - 独自拡張したngMatcherが存在 - Dependency injection => inject - 注入方法:Typescriptによる型 - HttpMock => MockBackend - TestFixtureの作成 => TestComponentBuilder - 変更検知 - Change Detection - fixture.detectChanges() - モジュールのロード - import - モジュールの書き換え - beforeEachProviders 小 さ い 大 き い
  • 28. - @angular/core/testing - describe, it, inject, etc… - @angular/compiler/testing - TestComponentBuilder - @angular/platform-browser/testing パッケージ名の変更 - angular2/testing - describe, it, inject, etc... - TestComponentBuilder - angular2/platform/testing/browser RCBeta.17
  • 29. Test APIの改善 - 非同期処理、変更検知が格段に良くなった - [RC] injectAsync => async - [Bata.16] autoDetectChanges() の導入 - 詳しくはJulie Ralphのプレゼンをチェック - Zone.js!!Zone.js!!Zone.js!! Testing you Tasks: Julie Ralph https://youtu.be/DltUEDy7ItY
  • 31. 基本方針 - 移行ではなく「移植」 - 残せるものを残す。残せる部分を増やす。 - 厳しい冬を想定したテストコードの剪定。 - Viewに依存しない「純粋なロジック」のみを移植 - ViewはComponentで書き直すケースが多くなる。 - Directiveに代表されるComponentとして再利用できるものは移植 OK。
  • 32. ユニットテストコード移植パス filter pipe providor, service, factory service directive controller directive
  • 33. ユニットテストコード移植パス filter pipe providor, service, factory service directive controller directive
  • 34. Controllerテストコード生存戦略 - Controller Helper Service パターン - 純粋なロジックをController Helper Serviceに移動、これを将来移植する - 既存のテストコードは Controller Helper Service に適用しておく angular.module('app') .controller('AppController', function() { var vm = this; this.doSomething = function () { // 何か移植する価値がありそうなロジック }; }); angular.module('app') .controller('AppController', function(AppControllerHelper) { var vm = this; this.doSomething = AppControllerHelper.doSomething; }); angular.module('app') .factory('AppControllerHelper', function() { return { doSomething: function () { // 何か移植する価値がありそうなロジック }; });
  • 38. まとめ - ユニットテストに関するAngular1の知見は再利用できる - Typescriptとzone.jsによりテストコードが書きやすくなっている - Angular1のテスト資産は「移植」する心意気で - 特にControllerのテストコードは注意!!
  • 39. 参考リンク - Angular 2 unit testing overview - http://www.slideshare.net/mitsuruogawa33/angular-2-unit-testing-overview - Angular 1 to 2 Quick Reference In unit testing - https://gist.github.com/mitsuruog/9e3e5c2c5d17a15a4c2a - Testing you Tasks: Julie Ralph - https://youtu.be/DltUEDy7ItY - mitsuruog/_angular2-unit-test-sample - https://github.com/mitsuruog/_angular2-unit-test-sample - mitsuruog/angular2-minimum-starter: Minimum starter kit for angular2 - https://github.com/mitsuruog/angular2-minimum-starter - I am mitsuruog - Angular2 unit test - https://goo.gl/3ypfaH