Я борюсь с тестированием сервиса в проекте 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);
});
});
Ошибка: