Юнит-тест Угловой сервис - PullRequest
0 голосов
/ 05 декабря 2018

Я борюсь с тестированием сервиса в проекте Angular.Служба довольно маленькая, но я не могу понять, как проверить наблюдателя в классе.

Я пытаюсь проверить метод этого класса.Публичные методы должны делать то, что обещают.Когда я вызываю метод «pop», проверка не проходит.Поскольку метод pop является открытым и имеет Message в качестве возвращаемых значений, этот метод должен возвращать сообщение после его вызова.Базовый код менее уместен в случае тестирования.

Причина, по которой тест не пройден, заключается в том, что наблюдатель все еще не определен в этот момент.Я полагаю, что причина в том, что метод обратного вызова не выполняется в тот момент, когда я вызываю метод pop в тесте, поэтому наблюдатель addMessage еще не инициализирован.

Поскольку я только начал этот проект, я осторожен с предположениями относительно кода. У кого-нибудь есть предложение, как я могу протестировать этот код?

Правильно ли, что метод pop является публичным или он должен быть закрытым?

Редактировать: метод pop используется несколькими другими классами и не может быть закрытым.Мой вопрос актуален: является ли эта реализация этой услуги правильной?



    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs';
    import { share} from 'rxjs/operators';
    import { Observer } from 'rxjs';
    import { Message } from 'primeng/components/common/api';


    @Injectable()
    export class FeedBackService {
      obsAddMessage: Observable;
      obsClearMessages: Observable;
      /** @internal */
      private clearMessages: Observer;
      private addMessage: Observer;

      /**
       * Creates an instance of FeedBackService.
       */
      constructor() {
        this.obsAddMessage = new Observable(observer => this.addMessage = observer).pipe(share());
        this.obsClearMessages = new Observable(observer => this.clearMessages = observer).pipe(share());
      }


      /**
       * Synchronously create and show a new message instance.
       *
       * @param {(string | Message)} type The type of the message, or a Message object.
       * @param {string=} title The message title.
       * @param {string=} body The message body.
       * @returns {Message}
       *          The newly created Message instance.
       */
      pop( type: string | Message, title?: string, body?: string ): Message {
        const message: any = typeof type === 'string' ? {severity: type, summary: title, detail: body} : type;

        if (!this.addMessage) {
          throw new Error('No Containers have been initialized to receive messages.');
        } else {
          this.addMessage.next(message);
        }
        return message;
      }
    }

Тест:


    import {Message} from 'primeng/components/common/api';
    import {FeedBackService} from './feedback.service';


    fdescribe('Service: Feedback', () => {

      let feedbackService: FeedBackService;
      const MESSAGE: Message = {severity: 'This is a message', summary: 'Title', detail: 'Body'};
      const SEVERITY = 'severity';
      const SUMMARY = 'summary';
      const DETAIL = 'detail';

      beforeEach(() => {
        feedbackService = new FeedBackService();
      });



      it('#pop should return the message when passing in a message', () => {
        let returnMessage = feedbackService.pop(MESSAGE);
        expect(returnMessage).toEqual(MESSAGE);
      });
    });

Ошибка:

enter image description here

1 Ответ

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

Как и любой Observable, obsAddMessage не выполняется до тех пор, пока на него не подписаны, и поэтому, как вы продемонстрировали, наблюдатель все еще не определен, если вы попытаетесь ввести новое значение перед подпиской.Решение состоит в том, чтобы просто настроить подписку перед вызовом feedbackService.pop().

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

it('#pop should return the message when passing in a message', () => {
  feedbackService.obsAddMessage.subscribe(message => console.log(message));
  let returnMessage = feedbackService.pop(MESSAGE);
  expect(returnMessage).toEqual(MESSAGE);
});

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...