下面是实现swUpdate的组件:
public thereIsUpdate: boolean;
constructor(public swUpdate: SwUpdate) {
this.checkForUpdates();
}
checkForUpdates() {
this.swUpdate.checkForUpdate().then(() => {
this.swUpdate.available.subscribe(swEvt => {
// an update is available
this.thereIsUpdate = true;
});
});
}下面是我的单元测试:
class MockSwUpdate {
available = new Subject<{ available: { hash: string } }>().asObservable();
activated = new Subject<{ current: { hash: string } }>().asObservable();
public checkForUpdate(): Promise<void> {
console.log('This is not working');
return new Promise((resolve) => resolve());
}
public activateUpdate(): Promise<void> {
return new Promise((resolve) => resolve());
}
constructor(public isEnabled: boolean) {
}
}
class MockApplicationRef {
isStable = new Subject<boolean>();
}
describe('xComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
xComponent
],
imports: [
RouterTestingModule,
ServiceWorkerModule.register('', {enabled: false})
],
providers: [
{provide: SwUpdate, useValue: MockSwUpdate},
{provide: ApplicationRef, useClass: MockApplicationRef}
]
}).compileComponents();
}));
}我的问题是不能为swUpdate**,做“模拟”,不知怎么它不起作用。**
不知何故,即使我指定了SwUpdate,也不会对它进行模拟。
当我运行ng test时,它显示了以下错误:
Uncaught TypeError: this.swUpdate.checkForUpdate is not a function thrown
TypeError: this.swUpdate.checkForUpdate is not a function请注意:模拟是,仅不适用于
发布于 2019-11-02 08:16:39
为了测试类似的服务,我在每个测试中手动创建了一个实例,而不是使用TestBed,并将其作为模拟swUpdate服务传递。
let mockSwUpdate: any;
beforeEach(() => {
mockSwUpdate = {
isEnabled: false,
activated: EMPTY,
available: EMPTY,
checkForUpdate: () => of(null).toPromise<void>(),
activateUpdate: () => of(null).toPromise<void>()
};
});
beforeEach(() => {
mockSwUpdate.isEnabled = true;
});
it('should call checkForUpdates', () => {
spyOn(mockSwUpdate, 'checkForUpdate').and.returnValue(null);
const service: ServiceWorkerService = new ServiceWorkerService(
mockSwUpdate as any
);
expect(mockSwUpdate.checkForUpdate).toHaveBeenCalled();
});
it('should return true is updateAvailbleEmits', (done: DoneFn) => {
mockSwUpdate.available = of(true);
const service: ServiceWorkerService = new ServiceWorkerService(
mockSwUpdate as any
);
service.updateAvailable$.subscribe(result => {
expect(result).toBeTruthy();
done();
});
});
...https://stackoverflow.com/questions/58521010
复制相似问题