내 문제를 설명하는 간단한 앱을 만들기 위해 angular-cli를 사용했습니다. 여기에 모든 코드가 표시됩니다. https://github.com/wholladay/tracking서비스를 호출하는 Angular 2 지시문을 테스트하려면 어떻게합니까?
지시문은 포함 된 요소를 클릭 할 때마다 서비스를 호출합니다. 따라서 서비스를 조롱하고 click 이벤트가 지시문에 전송 될 때 서비스가 호출되도록해야합니다. 여기
내 테스트 코드입니다 :/* tslint:disable:no-unused-variable */
import { inject, addProviders } from '@angular/core/testing';
import { TestComponentBuilder } from '@angular/compiler/testing';
import { Component } from '@angular/core';
import { By } from '@angular/platform-browser';
import { TrackingDirective } from './tracking.directive';
import { TrackingService } from './tracking.service';
class MockTrackingService extends TrackingService {
public eventCount = 0;
public trackEvent(eventName: string) {
this.eventCount++;
}
}
describe('TrackingDirective',() => {
let builder: TestComponentBuilder;
let mockTrackingService: MockTrackingService;
let trackingDirective: TrackingDirective;
beforeEach(() => {
mockTrackingService = new MockTrackingService();
trackingDirective = new TrackingDirective(mockTrackingService);
addProviders([
{provide: TrackingDirective, use: trackingDirective}
]);
});
beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
builder = tcb;
}));
// General button tests
it('should apply class based on color attribute', (done:() => void) => {
return builder.createAsync(TestApp).then(fixture => {
let testComponent = fixture.debugElement.componentInstance;
let buttonDebugElement = fixture.debugElement.query(By.css('button'));
buttonDebugElement.nativeElement.click();
expect(buttonDebugElement).toBeTruthy();
expect(mockTrackingService.eventCount).toBe(1);
done();
});
});
});
@Component({
selector: 'test',
template: `<button tracking="some button"></button>`,
directives: [TrackingDirective]
})
class TestApp {
}
그리고 여기 내 지시어 코드 : EVENTCOUNT 여전히 0 대신 1이기 때문에 내가 ng test
를 통해 테스트를 실행하면
import { Directive, HostListener, Input } from '@angular/core';
import { TrackingService } from './tracking.service';
@Directive({
selector: '[tracking]',
providers: [
TrackingService
]
})
export class TrackingDirective {
@Input() tracking: string;
constructor(private trackingService: TrackingService) {
}
@HostListener('click', ['$event.target'])
onClick(element) {
this.trackingService.trackEvent(this.tracking);
}
}
테스트가 실패 .
오, 세상에, 당신이 너무 감사합니다! 나는 내가 가까이에 있다는 것을 알았지 만, 나는 그 마지막 부분을 놓칠 수 없었다. – wholladay