次のサービスがあります。
@Injectable({
providedIn: 'root'
})
export class Service1 {
dataHasChanged = new Subject();
private data1;
private data2;
constructor() {}
getData() {
return {
data1: this.data1,
data2: this.data2
}
}
setData(data1, data2) {
this.data1 = data1;
this.data2 = data2;
this.dataHasChanged.next({
data1: this.data1,
data2: this.data2;
})
}
}
@Injectable({
providedIn: 'root'
})
export class Service2 {
constructor(private service1: Service1) {}
fetchClient(): Observable<ITest> {
const data = service1.getData();
return this.http.post(
'/api-endpoint/123',
{
data: data
}
);
}
reload(): Observable<ITest> {
return this.service1.dataHasChanged.pipe(
mergeMap(() => this.fetchClient()),
);
}
}
dataHasChanged がトリガーされるたびにservice2.reload()
、サブスクリプションからデータを受け取るコンポーネントをテストしたいと思います。
私はそれのために次のテストを作成しました:
describe('Service2', () => {
let service2: Service2;
let httpMock: HttpTestingController;
let service1: Service1;
let service1Stub: Partial<Service1>;
beforeEach(() => {
service1Stub = {
dataHasChanged: new Subject(),
getData: function () {
return {
data1: 123,
data2: 12345
}
}
};
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
Service2,
{
provide: Service1,
useValue: Service1Stub
}
]
});
service2 = TestBed.inject(service2);
httpMock = TestBed.inject(HttpTestingController);
service1 = TestBed.inject(service1);
});
it('test', (done: DoneFn) => {
service2.reload().subscribe((data) => {
console.log('here')
expect(data).toBeDefined();
done();
});
service1.dataHasChanged.next()
})
});
問題は、サブスクライブのコールバックにあるテストが実行されないことです...そのテストを書く適切な方法は何ですか?