-
-
Save wkwiatek/e8a4a9d92abc4739f04f5abddd3de8a7 to your computer and use it in GitHub Desktop.
| // App | |
| import { Component } from '@angular/core'; | |
| @Component({ | |
| selector: 'app', | |
| template: '<span>{{ sayHello() }}</span>', | |
| }) | |
| export class App { | |
| public name: string = 'John'; | |
| sayHello(): string { | |
| return `Hello ${this.name}`; | |
| } | |
| } | |
| // App tests | |
| describe('App', () => { | |
| beforeEach(() => { | |
| this.app = new App(); | |
| }); | |
| it('should have name property', () => { | |
| expect(this.app.name).toBe('John'); | |
| }); | |
| it('should say hello with name property', () => { | |
| expect(this.app.sayHello()).toBe('Hello John'); | |
| }); | |
| }); |
| // App | |
| import { Component, Input } from '@angular/core'; | |
| @Component({ | |
| selector: 'list', | |
| template: '<span *ngFor="let user of users">{{ user }}</span>', | |
| }) | |
| export class ListComponent { | |
| @Input() public users: Array<string> = []; | |
| } | |
| // App tests | |
| import { async, inject, TestBed } from '@angular/core/testing'; | |
| import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; | |
| TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); | |
| describe('ListComponent', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| declarations: [ListComponent] | |
| }); | |
| this.fixture = TestBed.createComponent(ListComponent); | |
| }); | |
| it('should render list', async(() => { | |
| const element = this.fixture.nativeElement; | |
| this.fixture.componentInstance.users = ['John']; | |
| this.fixture.detectChanges(); | |
| expect(element.querySelectorAll('span').length).toBe(1); | |
| })); | |
| }); | |
| // App DI | |
| class UserService { | |
| public users: Array<string> = ['John']; | |
| } | |
| @Component({ | |
| selector: 'list', | |
| template: '<span *ngFor="let user of users">{{ user }}</span>', | |
| }) | |
| class ListComponentBootstrapDI { | |
| private users: Array<string> = []; | |
| constructor(userService: UserService) { | |
| this.users = userService.users; | |
| } | |
| } | |
| class MockUserService { | |
| public users: Array<string> = ['John', 'Steve']; | |
| } | |
| describe('ListComponent DI', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| declarations: [ListComponentBootstrapDI], | |
| providers: [{ provide: UserService, useClass: MockUserService }], | |
| }); | |
| this.fixture = TestBed.createComponent(ListComponentBootstrapDI); | |
| }); | |
| it('should render list', async(() => { | |
| const element = this.fixture.nativeElement; | |
| this.fixture.detectChanges(); | |
| expect(element.querySelectorAll('span').length).toBe(2); | |
| })); | |
| }); | |
| // App DI for Component | |
| @Component({ | |
| selector: 'list', | |
| template: '<span *ngFor="let user of users">{{ user }}</span>', | |
| providers: [UserService], | |
| }) | |
| class ListComponentComponentDI { | |
| private users: Array<string> = []; | |
| constructor(userService: UserService) { | |
| this.users = userService.users; | |
| } | |
| } | |
| // App DI for Component tests | |
| describe('ListComponent DI Component', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| declarations: [ListComponentBootstrapDI], | |
| }); | |
| this.fixture = TestBed | |
| .overrideComponent(ListComponentBootstrapDI, { | |
| set: { | |
| providers: [{ provide: UserService, useClass: MockUserService }], | |
| }, | |
| }) | |
| .createComponent(ListComponentBootstrapDI); | |
| }); | |
| it('should render list', async(() => { | |
| const element = this.fixture.nativeElement; | |
| this.fixture.detectChanges(); | |
| expect(element.querySelectorAll('span').length).toBe(2); | |
| })); | |
| }); |
| // App | |
| class TestService { | |
| public name: string = 'Injected Service'; | |
| } | |
| // App tests | |
| import { inject, TestBed } from '@angular/core/testing'; | |
| import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; | |
| TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); | |
| describe('TestService', () => { | |
| beforeEach(() => { | |
| this.testService = new TestService(); | |
| }); | |
| it('should have name property set', () => { | |
| expect(this.testService.name).toBe('Injected Service'); | |
| }); | |
| }); | |
| describe('TestService Injected', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| providers: [TestService], | |
| }); | |
| }); | |
| it('should have name property set', inject([TestService], (testService: TestService) => { | |
| expect(testService.name).toBe('Injected Service'); | |
| })); | |
| }); | |
| class MockTestService { | |
| public mockName: string = 'Mocked Service'; | |
| } | |
| describe('TestService Mocked', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| providers: [{ provide: TestService, useClass: MockTestService }], | |
| }); | |
| }); | |
| it('should have name property set', inject([TestService], (testService: TestService) => { | |
| expect(testService.mockName).toBe('Mocked Service'); | |
| })); | |
| }); | |
| class MockTestServiceInherited extends TestService { | |
| public sayHello(): string { | |
| return this.name; | |
| } | |
| } | |
| describe('TestService Mocked Inherited', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| providers: [{ provide: TestService, useClass: MockTestServiceInherited }], | |
| }); | |
| }); | |
| it('should say hello with name', inject([TestService], (testService: TestService) => { | |
| expect(testService.sayHello()).toBe('Injected Service'); | |
| })); | |
| }); |
| // App | |
| import { Injectable } from '@angular/core'; | |
| import { Http } from '@angular/http'; | |
| @Injectable() | |
| export class TestService { | |
| constructor(private http: Http) {} | |
| getUsers() { | |
| return this.http.get('http://foo.bar'); | |
| } | |
| } | |
| // App tests | |
| import { inject, TestBed } from '@angular/core/testing'; | |
| import { BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; | |
| import { MockBackend, MockConnection } from '@angular/http/testing'; | |
| import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; | |
| TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); | |
| describe('Http', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| providers: [ | |
| TestService, | |
| BaseRequestOptions, | |
| MockBackend, | |
| { | |
| provide: Http, | |
| useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { | |
| return new Http(backend, defaultOptions); | |
| }, | |
| deps: [MockBackend, BaseRequestOptions], | |
| }, | |
| ], | |
| }); | |
| }); | |
| beforeEach(inject([MockBackend], (backend: MockBackend) => { | |
| const baseResponse = new Response(new ResponseOptions({ body: 'got response' })); | |
| backend.connections.subscribe((c: MockConnection) => c.mockRespond(baseResponse)); | |
| })); | |
| it('should return response when subscribed to getUsers', inject([TestService], (testService: TestService) => { | |
| testService.getUsers().subscribe((res: Response) => { | |
| expect(res.text()).toBe('got response'); | |
| }); | |
| })); | |
| }) |
| // App | |
| import { Component } from '@angular/core'; | |
| import { Routes } from '@angular/router'; | |
| @Component({ | |
| selector: 'app', | |
| template: `<router-outlet></router-outlet>` | |
| }) | |
| class AppComponent {} | |
| // App tests | |
| import { async, TestBed } from '@angular/core/testing'; | |
| import { RouterTestingModule } from '@angular/router/testing'; | |
| import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; | |
| TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); | |
| describe('AppComponent', () => { | |
| beforeEach(() => { | |
| TestBed.configureTestingModule({ | |
| declarations: [AppComponent], | |
| imports: [RouterTestingModule] | |
| }); | |
| }); | |
| it('should be able to test', async(() => { | |
| const fixture = TestBed.createComponent(AppComponent); | |
| fixture.whenStable().then(() => { | |
| expect(true).toBe(true); | |
| }); | |
| })); | |
| }); |
Does this holds good for RC.6 ?, Upto what version is this code snippets valid?
I was able to update it to the final version of Angular 2. Enjoy!
Thanks for this!
https://gist.github.com/wkwiatek/e8a4a9d92abc4739f04f5abddd3de8a7#file-app-3-http-spec-ts-L49
Yay! First HTTP example that I see that does not uses uses async() or fackeAsyc() / tick().
Does somebody knows since when this is not required any more? Code seems to run fully synchronous anyway...
awesome! thank you!
Hi, thanks for the gist! I've a question.
How can I change just one provider. In my case I've a component that have a resolver that returns data from 2 API calls. The data of this resolver is on ActivatedRoute provider. I want to have multiple test cases with different data. How could I override just ActivatedRoute?
I'm looking into overrideComponent this way:
// getDefaultProviders return an Array with common providers
fixture = TestBed
.configureTestingModule({
imports: [ HttpModule, SchedulesModule ],
providers: [ ...getDefaultProviders() ]
})
.overrideComponent(MyComponent, {
set: {
providers: [
{
provide: ActivatedRoute,
useValue: { snapshot: { data: { myData: 'Something here different in each scenario' } } },
},
]
}
})
.createComponent(MyComponent);It's a good idea to have multiple configureTestingModule in the same file?
Thank you !
@Ajeey, You can do something like this
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpModule],
declarations: [Component],
providers: [{provide: XHRBackend, useClass: MockBackend}]
}).compileComponents();
fixture = TestBed.createComponent(SendEmailComponent);
component = fixture.componentInstance;
});
// and then to test it you do these
it("should do somthing", async(inject([XHRBackend], (be: MockBackend) => {
be.connections.subscribe((c: MockConnection) => c.mockError(error));
// and you execute the function that makes the request
})
thank you for providing these gists!