Angular 模拟具有用于测试的RxJS观测值的角度服务
我希望模拟我在Angular应用程序中构建的服务。我的服务如下:Angular 模拟具有用于测试的RxJS观测值的角度服务,angular,unit-testing,typescript,karma-jasmine,sinon,Angular,Unit Testing,Typescript,Karma Jasmine,Sinon,我希望模拟我在Angular应用程序中构建的服务。我的服务如下: @Injectable() export class WizardDialogNavigationService { public navAction$: Observable<any>; public navActionSubject: BehaviorSubject<any> = new BehaviorSubject(null); constructor() { this.na
@Injectable()
export class WizardDialogNavigationService {
public navAction$: Observable<any>;
public navActionSubject: BehaviorSubject<any> = new BehaviorSubject(null);
constructor() {
this.navAction$ = this.navActionSubject.asObservable();
}
public navAction(action: string): void {
this.navActionSubject.next(action);
}
}
我需要模拟我的服务来测试我的组件,但是我用了错误的方法,例如,我创建了模拟服务,就像这样
class MockWizardDialogNavigationService {
public navAction$: Observable<any>;
public navActionSubject: BehaviorSubject<any> = new BehaviorSubject(null);
// this is wrong?
constructor() {
this.navAction$ = this.navActionSubject.asObservable();
}
public navAction(action: string): void {
// how do I mock a .next?
}
}
然后添加一个存根,以便在调用navAction方法时监听:
stubWizardService = sinon.createStubInstance(WizardDialogNavigationService);
然而,我觉得这是错误的,我通常在模拟中声明navAction$observable,并且在运行测试时,我得到以下错误:
未捕获(承诺中):TypeError:undefined不是对象
(正在评估'this.wizardDialogNavigationService.navAction$.subscribe')
也许有人能解释一下我需要做什么来模拟服务和防止错误?如果我没有很好地解释自己或者需要更多的代码,请让我知道。我对测试知之甚少,正在努力学习。模拟服务和服务调用很重要。您不想使用真正的promise,因为它处理异步,并且可能会失败。您可以将错误模拟为错误 这是一个如何模拟服务的示例
it('should mock videos', inject([VideoService], (videoService: VideoService) => {
videos = [
{ id: 0, name: 'Superman' },
{ id: 1, name: 'Superman part 2' }
]
spyOn(videoService, 'videos').and.returnValue(videos);
fixture.detectChanges();
expect(component.getVideoOne()).toContain(Superman);
});
在@jonsharpe的建议下,我发现了问题所在——我删除了模拟服务类,并创建了一个类似这样的存根实例
MockWizardDialogNavigationService = sinon.createStubInstance(WizardDialogNavigationService);
我将服务保存在提供者数组中
{provide: WizardDialogNavigationService, useValue: MockWizardDialogNavigationService},
那么我就这样声明navAction$
TestBed.compileComponents().then(() => {
// some code removed
stubWizardService.navAction$ = Observable.empty();
});
一切正常 问同样的问题并删除它不太可能得到答案。Angular文档包括一个测试依赖于异步服务的组件的示例:请阅读指南。。。。
{provide: WizardDialogNavigationService, useValue: MockWizardDialogNavigationService},
TestBed.compileComponents().then(() => {
// some code removed
stubWizardService.navAction$ = Observable.empty();
});