Angular - Unit testing Subject()?

Viewed 12121

I have a Angular service that simply uses a Subject, but I am unsure of how to write unit tests for it.

I saw [this thread][1], but I didn't find it terribly helpful.

I have attempted to mock next() but I am more than a little lost.

2 Answers

You should spy on service.serviceMsg and not service, because next() method appears to be on serviceMsg subject.

it('should catch what is emitted', () => {
    const nextSpy = spyOn(service.serviceMsg, 'next');
    service.confirm(ACTION);
    expect(nextSpy).toHaveBeenCalled();
});

EDIT :

You should also change the way you are creating service instance. What you show in your code is applicable only for component instance creation

beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [MessageService]
    });
    service = TestBed.get(MessageService); // get service instance
    httpMock = TestBed.get(HttpTestingController);
});

Firstly you can just subscribe to your Subject and inside expect some value and after that just execute method which will emit that:

it('should catch what is emitted', () => {
    service.serviceMsg.subscribe(msg => {
        expect(msg).toEqual(something);
    });
    service.confirm(value); // this should match what you expect above
});
Related