I was struggling to test nested with observables and testing emits.
I was looking at a few posts on medium, however it didn't cut it when I needed it to work.
A simple fix that I found on stack overflow helped a lot.
I didn't even use a textcomponentfixture class. It was a bit too complicated.
Following the guide on Stackoverflow and using SpyOn emits we can achieve a good test.
So the first thing you want to do is setup the test and a SpyObj inside your beforeAll
method in your test suite.
let spyEmit: jasmine.SpyObj<EventEmitter<Project>> beforeAll(() => { spyEmit = jasmine.createSpyObj('EventEmitter', ['emit']); });
Make sure you have the spyEmit in your describe.
Then you have to make sure you set the default EventEmitter in your beforeEach
So before you run your fixture.detectChanges();
make sure you set you fake EventEmitter.
... fixture = TestBed.createComponent(ProjectFormComponent); component = fixture.componentInstance; component.projectDataReturn = spyEmit; ...
This is so that it reflects this code in the parent component:
... @Output() projectDataReturn = new EventEmitter<Project>(); ...
Now when you run your code can use a fake spy
... spyEmit.emit.and.callFake((project) => { expect(project).toEqual({...fakeProject, id: "old1"}); }); ...
This allows you to capture the call and check it for each test units.
Of course you can run expect(spyEmit.emit).toHaveBeenCalled();
to check if the fake method has been called.
Top comments (0)