Skip to content

Commit 6b3c432

Browse files
committed
Unit tests for MessageComponent
1 parent 972f56f commit 6b3c432

2 files changed

Lines changed: 81 additions & 18 deletions

File tree

src/app/messages/messages.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
<h2>Messages</h2>
44
<button class="clear" (click)="messageService.clear()">clear</button>
5-
<div *ngFor='let message of messageService.messages'> {{message}} </div>
5+
<div *ngFor='let message of messageService.messages'>{{message}}</div>
66

77
</div>
Lines changed: 80 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
22

33
import { MessagesComponent } from './messages.component';
44
import { MessageService } from '../message.service';
@@ -7,25 +7,88 @@ describe('MessagesComponent', () => {
77
let component: MessagesComponent;
88
let fixture: ComponentFixture<MessagesComponent>;
99

10-
beforeEach(async(() => {
11-
TestBed.configureTestingModule({
12-
declarations: [
13-
MessagesComponent
14-
],
15-
providers: [
16-
MessageService
17-
]
18-
})
19-
.compileComponents();
20-
}));
10+
/**
11+
* Configure `TestBed`
12+
* @param messageService Message service or mock
13+
* @return Promise
14+
*/
15+
function configureTestingModule(messageService: any = MessageService) {
16+
return TestBed
17+
.configureTestingModule({
18+
declarations: [MessagesComponent],
19+
providers: [{ provide: MessageService, useClass: messageService }]
20+
})
21+
.compileComponents()
22+
.then(() => {
23+
fixture = TestBed.createComponent(MessagesComponent);
24+
component = fixture.componentInstance;
25+
});
26+
}
2127

22-
beforeEach(() => {
23-
fixture = TestBed.createComponent(MessagesComponent);
24-
component = fixture.componentInstance;
28+
it('should create', () => configureTestingModule().then(() => {
2529
fixture.detectChanges();
30+
expect(component).toBeTruthy();
31+
}));
32+
33+
describe('when message service contains messages', () => {
34+
const messages = ['foo', 'bar'];
35+
beforeEach(() => configureTestingModule(class { messages: String[] = messages; }));
36+
37+
it('should display a "Messages" title', () => {
38+
fixture.detectChanges();
39+
40+
const titleElement = fixture.nativeElement.querySelector('h2');
41+
expect(titleElement).toBeDefined();
42+
expect(titleElement.textContent).toBe('Messages');
43+
});
44+
45+
it('should display a "clear" button', () => {
46+
fixture.detectChanges();
47+
48+
const clearButtonElement = fixture.nativeElement.querySelector('button.clear');
49+
expect(clearButtonElement).toBeDefined();
50+
expect(clearButtonElement.textContent).toBe('clear');
51+
});
52+
53+
it('should display messages from the message service', () => {
54+
fixture.detectChanges();
55+
56+
const messageElements = fixture.nativeElement.querySelector('div').querySelectorAll('div');
57+
expect(messageElements.length).toBe(2);
58+
59+
const displayedMessages = Array.from(messageElements).map((d: HTMLElement) => d.textContent);
60+
expect(displayedMessages).toEqual(messages);
61+
});
62+
63+
describe('#clear button', () => {
64+
it('should empty the message list when clicked', () => {
65+
fixture.detectChanges();
66+
component.messageService.clear = jasmine.createSpy('clear');
67+
68+
const clearButtonElement = fixture.nativeElement.querySelector('button.clear');
69+
clearButtonElement.click();
70+
expect(component.messageService.clear).toHaveBeenCalled();
71+
});
72+
});
2673
});
2774

28-
it('should create', () => {
29-
expect(component).toBeTruthy();
75+
describe('when message service contains no message', () => {
76+
const messages = [];
77+
beforeEach(() => configureTestingModule(class { messages: String[] = messages; }));
78+
79+
it('should not display "Messages"', () => {
80+
fixture.detectChanges();
81+
expect(fixture.nativeElement).not.toContain('Messages');
82+
});
83+
84+
it('should not display any button', () => {
85+
fixture.detectChanges();
86+
expect(fixture.nativeElement.querySelectorAll('button').length).toBe(0);
87+
});
88+
89+
it('should not display the container element', () => {
90+
fixture.detectChanges();
91+
expect(fixture.nativeElement.querySelector('div')).toBe(null);
92+
});
3093
});
3194
});

0 commit comments

Comments
 (0)