Прохождение компонента углового модульного теста в SpyObject of Service - PullRequest
0 голосов
/ 02 апреля 2019

Я ставлю службу в моем компоненте Сейчас я хочу шпионить за всеми методами, а не вызывать их.

Я следовал угловому учебнику , который создает шпионский объект и затем определяет функцию возврата:

  it('#getValue should return stubbed value from a spy', () => {
    // create `getValue` spy on an object representing the ValueService
    const valueServiceSpy =
      jasmine.createSpyObj('ValueService', ['getValue']);

    // set the value to return when the `getValue` spy is called.
    const stubValue = 'stub value';
    valueServiceSpy.getValue.and.returnValue(stubValue);

Вместо того, чтобы возвращать определенное значение, я хочу вызвать этот конкретный метод. Я также переместил шпиона в beforeEach, потому что я хочу использовать его в нескольких тестах. Причина, по которой я не хочу издеваться над созданием формы, заключается в том, что это будет копия 1: 1 оригинального метода.

Spec

describe('GeneratorComponent', () => {
  let component: GeneratorComponent;
  let fixture: ComponentFixture<GeneratorComponent>;

  beforeEach(async(() => {
    const hotkeysServiceSpy = jasmine.createSpyObj('HotkeysService', ['add']);
    const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
      'createGeneratorForm',
      'createRepository',
      'crawlRepository',
      'fillWithDummy'
    ]);
    generatorServiceSpy.createGeneratorForm.and.callThrough();
...

  beforeEach(() => {
    fixture = TestBed.createComponent(GeneratorComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

Компонент

constructor(
    private generatorService: GeneratorService,
    ...
  ) {
    this.generatorForm = generatorService.createGeneratorForm();
    this.generatorForm.valueChanges.debounceTime(500).subscribe( (changes) => {
    ...  
    });

Теперь я получаю TypeError: Cannot read property 'valueChanges' of undefined.

Вопросы:

1) Как просто вызвать этот конкретный метод, который создает мою форму?

2) Требует ли этот вызов через меня импортировать / предоставить все зависимости службы (конструктора службы) или только зависимости этого конкретного метода?

1 Ответ

0 голосов
/ 08 апреля 2019

Я нашел несколько вариантов:

А)

  1. Создание оригинальной услуги

  2. Создание SpyObj.

  3. Переопределить метод создания формы SpyObj оригинальным методом

Это imho не лучший подход, потому что он требует импортировать все зависимости службы в Testbed.

B)

Переопределить метод формы в спецификации, например,

const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
      'createRepository',
      'crawlRepository',
      'fillWithDummy'
    ]);
    const formBuilder = new FormBuilder();
    generatorServiceSpy.createGeneratorForm = (generator?: Generator) => {
      console.log('generator', generator);
      const generatorForm = formBuilder.group({
        url: [null]
      });
      if (generator) { generatorForm.patchValue(generator); }
      return generatorForm;
    };

Это может быть полезно, если упрощенная версия метода лучше подходит для тестирования. Недостаток в том, что он не очень сухой.

в) Это мое предпочтительное решение. Он сочетает в себе минимальные объявления зависимостей с оригинальной функциональностью.

beforeEach(async(() => {
    const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
        'createRepository',
        'crawlRepository',
        'fillWithDummy'
    ]);
    const formBuilder = new FormBuilder();
    generatorServiceSpy.createGeneratorForm = GeneratorService.prototype.createReviewForm;
...