// Angular import { Component } from '@angular/core'; // Services import {PostService} from './app/services/post.service'; import {Post} from './app/models/post.model'; @Component({ selector: 'app', template: ` <div *ngIf="isDataLoaded"> <table-component [post]="post"></table-component> </div> ` }) export class AppComponent { public isDataLoaded: boolean = false; public post: Post; constructor(public postService: PostService) {} ngOnInit(): void { this.postService.getPost().subscribe((post: any) => { this.post = new Post(post); this.isDataLoaded = true; }); } }
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { HttpModule } from '@angular/http'; // Components import { AppComponent } from './app/app.component'; import {TableComponent} from './app/components/table/table.component'; // Services import {PostService} from './app/services/post.service'; @NgModule({ declarations: [ AppComponent TableComponent ], imports: [ BrowserModule, HttpModule ], providers: [ PostService ], bootstrap: [AppComponent] }) export class AppModule {}
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; platformBrowserDynamic().bootstrapModule(AppModule);
// Angular import {Component, Input} from '@angular/core'; @Component({ selector: 'table-component', template: `<table> <thead> <tr> <th>Post Title</th> <th>Post Author</th> </tr> </thead> <tbody> <tr> <td>{{ post.title}}</td> <td>{{ post.author}}</td> </tr> </tbody> </table>` }) export class TableComponent { @Input() public post: any; }
import {Injectable} from '@angular/core'; import {Observable} from 'rxjs/Rx'; import {Post} from './app/models/post.model'; import { Http } from '@angular/http'; @Injectable() export class PostService { constructor(http: Http) {} public getPost(): any { // - Facebook Google return this.http.get(AbstractAPI.url) .map((res: any) => res.json()) } }
export class Post { public title: number; public author: string; constructor(post: any) { this.title = post.title; this.author = post.author; } }
import {setBaseTestProviders} from '@angular/core/testing'; import { TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS, TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS } from '@angular/platform-browser-dynamic/testing'; setBaseTestProviders( TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS, TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS );
import {TestBed} from '@angular/core/testing'; import {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing'; TestBed.initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting() );
import {disableDeprecatedForms, provideForms} from @angular/forms; bootstrap(App, [ disableDeprecatedForms(), provideForms() ]);
import {DeprecatedFormsModule, FormsModule, ReactiveFormsModule} from @angular/common; @NgModule({ declarations: [MyComponent], imports: [BrowserModule, DeprecatedFormsModule], boostrap: [MyComponent], }) export class MyAppModule{}
import {Post} from './../app/models/post.model'; let testPost = {title: 'TestPost', author: 'Admin'} describe('Post', () => { it('checks Post properties', () => { var post = new Post(testPost); expect(post instanceof Post).toBe(true); expect(post.title).toBe("testPost"); expect(post.author).toBe("Admin"); }); });
import { inject, fakeAsync, TestBed, tick } from '@angular/core/testing'; import {MockBackend} from '@angular/http/testing'; import { Http, ConnectionBackend, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; import {PostService} from './../app/services/post.service'; describe('PostService', () => { beforeEach(() => { // TestBed.configureTestingModule({ providers: [ PostService, BaseRequestOptions, MockBackend, { provide: Http, useFactory: (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) => { return new Http(backend, defaultOptions); }, deps: [MockBackend, BaseRequestOptions]} ], imports: [ HttpModule ] }); }); describe('getPost methods', () => { it('is existing and returning post', // inject([PostService, MockBackend], fakeAsync((ps: postService, be: MockBackend) => { var res; // backend.connections.subscribe(c => { expect(c.request.url).toBe(AbstractAPI.url); let response = new ResponseOptions({body: '{"title": "TestPost", "author": "Admin"}'}); c.mockRespond(new Response(response)); }); ps.getPost().subscribe((_post: any) => { res = _post; }); // , tick(); expect(res.title).toBe('TestPost'); expect(res.author).toBe('Admin'); })) ); }); });
import {PostService} from './../app/services/post.service'; import {Observable} from 'rxjs'; export class MockPostService extends PostService { constructor() { // super(); } // , getPost() { // Http Observable, Observable . return Observable.of({title: 'TestPost', author: 'Admin'}); } }
import { inject, addProviders } from '@angular/core/testing'; import {TableComponent} from './../app/components/table/table.component'; // . import {TestComponentBuilder} from '@angular/core/testing'; @Component({ selector : 'test-cmp', template : '<table-component [post]="postMock"></table-component>' }) class TestCmpWrapper { public postMock = new Post({'title': 'TestPost', 'author': 'Admin'}); } describe("TableComponent", () => { it('render table', inject([TestComponentBuilder], (tcb) => { return tcb.overrideProviders(TableComponent) .createAsync(TableComponent) // fixture . , fixture.debugElement.children. .then((fixture) => { let componentInstance = fixture.componentInstance; let nativeElement = jQuery(fixture.nativeElement); componentInstance.post = new Post({title: 'TestPost', author: 'Admin'}); fixture.detectChanges(); let firstTable = nativeElement.find('table'); expect(firstTable.find('tr td:nth-child(1)').text()).toBe('TestPost'); expect(firstTable.find('tr td:nth-child(2)').text()).toBe('Admin'); }); })); });
import {Component} from '@angular/core'; // TestComponentBuilder TestBed, . import {TestBed, async} from '@angular/core/testing'; import {Post} from './../app/models/post.model'; import {TableComponent} from './../app/components/table/table.component'; // Services import {PostService} from './../app/services/post.service'; import {MockPostService} from './post.service.mock' // . @Component({ selector : 'test-cmp', template : '<table-component [post]="postMock"></table-component>' }) class TestCmpWrapper { public postMock = new Post({'title': 'TestPost', 'author': 'Admin'}); } describe("TableComponent", () => { // - , . beforeEach(() => { TestBed.configureTestingModule({ declarations: [ TestCmpWrapper, TableComponent ], providers: [ {provide: PostService, useClass: MockPostService ] }); }); describe('check rendering', () => { it('if component is rendered', async(() => { // createAsync() compoleComponents() + createComponent(). - , TestCmpWrapper, - . - . TestBed.compileComponents().then(() => { let fixture = TestBed.createComponent(TestCmpWrapper); let componentInstance = fixture.componentInstance; let nativeElement = jQuery(fixture.nativeElement); componentInstance.post = new Post({title: 'TestPost', author: 'Admin'}); fixture.detectChanges(); let firstTable = nativeElement.find('table'); expect(firstTable.find('tr td:nth-child(1)').text()).toBe('TestPost'); expect(firstTable.find('tr td:nth-child(2)').text()).toBe('Admin'); }); })); }); });
Source: https://habr.com/ru/post/307936/
All Articles