My general question is how to setup an angular test when attempting to test a service that has other services as dependencies, with some of those services having other dependencies. Also, my services use both observables and promises. Do I need to mock every single constructor and method? That is what the error I am getting (detailed in the comments below) seems to indicate. How can I best accomplish this? I would also greatly appreciate pointers on how to setup this kind of test using marbles or pointers to any useful resources.
My code is largely inspired by this example which seems to do what I want to do: https://gist.github.com/btroncone/b1ef4df357278d0af33372302eb2141e
//Service I would like to test
export class ServiceToTest{
constructor(
private dependency1: Dependency1Service,
private dependency2: Dependency2Service
) {}
.
.
.
.
getData1() : Promise<stsring>{return dependency1.getData1();} //method I want to test
getData2(){}
getData2(){}
}
export class Dependency1Service{
constructor(
private dependency1: SubDependency1Service,
private dependency2: SubDependency2Service,
private dependency3: SubDependency3Service,
) {}
.
.
.
.
getData1() : Observable<IPayload<IData>>{ return ...}
getData2(){}
getData2(){}
}
export class Dependency2Service{
constructor(
private dependency1: SubDependency3Service,
private dependency2: SubDependency4Service,
private dependency3: SubDependency5Service,
) {}
.
.
.
.
getData1(){}
getData2(){}
getData2(){}
}
export class SubDependency1Service{
constructor(
private dependency1: AnotherDependency1Service,
private dependency2: AnotherDependency2Service,
private dependency3: AnotherDependency3Service,
) {}
.
.
.
.
getData1(){}
getData2(){}
getData2(){}
}
//=======================================================================
//TEST SETUP
//=======================================================================
const payload: Observable<IPayload<IData>> = of({something1,something2})
export class MockDependency1Service{
getData1(){ return payload };
}
const data2 = new Promis<DataType[]>((resolve,reject) => {
setTimeout(() => {
resolve([]);
}, 1000);
});
export class MockDependency2Service{
getData(){ return data };
}
describe('Service to test', () => {
let mockDependency1Service = new Dependency1Service();
let mockDependency2Service = new Dependency2Service();
beforeEach(() => {
spyOn(MockDependency1Service, 'getData1');
spyOn(MockDependency2Service, 'getData1').and.returnValue(payload); });
beforeEach(() => TestBed.configureTestingModule ({
providers: [
{provide: Dependency1Service, useValue: mockDependency1Service},
{provide: Dependency2Service, useValue: mockDependency2Service}
}));
//observable
it('should return result', (done) => {
const service = new TwilioConnectionService(mockDataService,mockLocalTrack); //error here on mockDataService -- Argument of type 'MockDependency1Service' is not assignable to parameter of type 'Dependency1Service'. Type 'MockDependency1Service' is missing the following properties from type 'Dependency1Service': dependency1, dependency2, dependency3, getData2,getData3' --basically any injected property or any method that is not defined in export class MockDependency1Service.
const obs = service.getAccessToken();
obs.subscribe(res => {
setTimeout(() => {
expect(res.data.jwt).toBe('0234ljksdlkgoier')//data.jwt)
done();
}, 100);
});
});