Тестирование клика из Директивы об угловых атрибутах - PullRequest
0 голосов
/ 21 марта 2019

У меня проблемы с созданием модульного теста для Директивы угловых атрибутов, которую я написал.Директива называется TrackClickDirective , и я пытаюсь проверить следующее.

  • Когда щелкает элемент, к которому прикреплена эта директива, он должен вызывать определенный метод длядиректива.

Я подозреваю, что это проблема с моей конфигурацией модульного теста.

Пожалуйста, ознакомьтесь с моей реализацией на StackBlitz, где вы можете увидеть выполнение теста:

StackBltiz: https://stackblitz.com/edit/angular-test-click-on-attribute-directive-with-hostlistener

Вот мой код модульного теста- track-click.directive.spec.ts :

import { Component, ElementRef, DebugElement } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from "@angular/platform-browser";
import { TrackClickDirective } from './track-click.directive';
import { Analytics} from './analytics.service';

class MockAnalytics {
  eventTrack() {}
};
class MockElementRef {
}

@Component({
  template: '<button appTrackClick>Test</button>'
})
export class TestButtonWithoutNameComponent { }

describe('TrackClickDirective', () => {

  let component: TestButtonWithoutNameComponent;
  let fixture: ComponentFixture<TestButtonWithoutNameComponent>;
  let directive: TrackClickDirective;
  let inputEl: DebugElement;
  let spy: any;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        TestButtonWithoutNameComponent
      ],
      providers: [
        TrackClickDirective,
        { provide: Analytics, useClass: MockAnalytics },
        { provide: ElementRef, useClass: MockElementRef }
      ]
    });
    fixture = TestBed.createComponent(TestButtonWithoutNameComponent);
    component = fixture.componentInstance;
    directive = TestBed.get(TrackClickDirective);
    inputEl = fixture.debugElement.query(By.css('button'));
  });

  it('should call the trackClick methoe when the button is clicked', () => {
    spy = spyOn(directive, 'trackClick');
    inputEl.triggerEventHandler('click', null);
    fixture.detectChanges();
    expect(directive.trackClick).toHaveBeenCalled();
  });
});

Что я здесь не так делаю? Когда я запускаю модульный тест, я получаю следующее:

FAILED TESTS:
  TrackClickDirective
    ✖ should call the trackClick method when the button is clicked
      HeadlessChrome 72.0.3626 (Mac OS X 10.14.0)
    Expected spy trackClick to have been called.

1 Ответ

1 голос
/ 25 марта 2019

Следуя примеру на Документы Angular .

Следующие действия должны помочь:

import { Component, ElementRef, DebugElement } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from "@angular/platform-browser";
import { TrackClickDirective } from './track-click.directive';
import { Analytics} from './analytics.service';

class MockAnalytics {
  eventTrack() {}
};
class MockElementRef {
}

@Component({
  template: '<button appTrackClick>Test</button>'
})
export class TestButtonWithoutNameComponent { }

describe('TrackClickDirective', () => {

  let component: TestButtonWithoutNameComponent;
  let fixture: ComponentFixture<TestButtonWithoutNameComponent>;
  let directive: TrackClickDirective;
  let inputEl: DebugElement;
  let spy: any;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        TestButtonWithoutNameComponent,
        TrackClickDirective
      ],
      providers: [
        TrackClickDirective,
        { provide: Analytics, useClass: MockAnalytics },
        { provide: ElementRef, useClass: MockElementRef }
      ]
    });
    fixture = TestBed.createComponent(TestButtonWithoutNameComponent);
    component = fixture.componentInstance;
    directive = TestBed.get(TrackClickDirective);
    inputEl = fixture.debugElement.query(By.css('button'));
  });

  it('should call the trackClick method when the button is clicked', () => {
    directive = fixture.debugElement.query(By.directive(TrackClickDirective)).injector.get(TrackClickDirective) as TrackClickDirective;
    spy = spyOn(directive, 'trackClick');
    inputEl.triggerEventHandler('click', null);
    fixture.detectChanges();
    expect(directive.trackClick).toHaveBeenCalled();
  });
});

Ключ в этой строке:

fixture.debugElement.query(By.directive(TrackClickDirective)).injector.get(TrackClickDirective) as TrackClickDirective;

Хотя это очень многословно, оно позволяет вам получить фактический экземпляр вашей директивы, который был создан и используется в компоненте, что, в свою очередь, позволяет вам следить за его методами.

Обновлен пример StackBlitz: https://stackblitz.com/edit/angular-test-click-on-attribute-directive-with-hostlistener

...