Угловой сервисный конструктор, блокирующий юнит-тесты - PullRequest
0 голосов
/ 20 декабря 2018

Я столкнулся с проблемой при написании модульных тестов для сервиса, который имеет некоторые действия в конструкторе.Он блокирует мой тест, и я не знаю, как с ним справиться: (

Это класс обслуживания:

import { Injectable } from '@angular/core';

import { Storage } from '@dvs-angular/storage';

const COOKIE_STORAGE_KEY = 'cookiePanelDisplayed';

@Injectable()
export class CookiePanelService {
  public panelVisible: boolean = true;

  constructor(
    private storage: Storage
  ) {
    this.panelVisible = !this.storage.has(COOKIE_STORAGE_KEY);
  }

  public close(): void {
    this.panelVisible = false;

    if (this.storage.has(COOKIE_STORAGE_KEY)) {
      return;
    }

    this.storage.set(COOKIE_STORAGE_KEY, true);
  }
}

и вот так выглядят мои тесты

import { TestBed, inject } from '@angular/core/testing';

import { CookiePanelService } from './cookie-panel.service';
import { Storage } from '@dvs-angular/storage';

const storageMock = {
  has: jasmine.createSpy()
};

const COOKIE_STORAGE_KEY = 'cookiePanelDisplayed';

describe('Service: CookiePanelService', () => {

  let cookiePanelService: CookiePanelService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        CookiePanelService,
        {
          provide: Storage,
          useValue: storageMock
        },
      ]
    });
  });

  beforeEach(
    inject([CookiePanelService], (service: CookiePanelService) => {
      cookiePanelService = service;
    })
  );

  it('should set panelVisible to false on close', () => {
    cookiePanelService.panelVisible = true;
    cookiePanelService.close();

    expect(cookiePanelService.panelVisible).toBe(false);
  });

});

В консоли я получаю: TypeError: this.storage.has is not a function

Можете ли вы дать совет, как поступить с конструктором и как избежать подобных ситуаций?.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Одним из самых простых решений является добавление префикса @option к экземпляру службы в конструкторе в компоненте, в который вы добавляете эту службу.

например: -

import {Optional} from "@angular/core";

constructor( @Optional() private cookiePanelService:CookiePanelService  ){}

Надеюсь, это сработает

0 голосов
/ 20 декабря 2018

Создайте свой макет, как показано ниже.

const storageMock = {
  has: function() {},
  set: function() {},
};

Сохраняйте это простым.Когда вы useValue, он просто ожидает быть объектом.

jasmine.createSpy() возвращает spy.в то время как has должен быть function


Обновление:

Вы можете установить spy для функции, как показано ниже.

spyOn(storage, 'has');
expect(storage.set).toHaveBeenCalledWith(COMPANY_STORAGE_KEY_MOCK);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...