我已经为我正在测试的组件创建了一个测试(规范)文件。但是当我运行测试时,它会给我一个错误说
Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at ComponentUndertest.ngOnInit
这是显而易见的,因为我在ngOnInit()方法中订阅了某些内容,但是我可以在测试期间忽略订阅吗?或者我可以在测试期间伪造订阅吗? 我已经搜索了很多关于这个问题但是找不到与angular2测试有关的任何内容。 提前谢谢。
答案 0 :(得分:34)
假设您的服务有一个返回可观察对象的方法,比如说
class SomeService {
getData(): Observable<Data> {}
}
创建spy1,返回一个带有noop订阅功能的对象。
let mockSomeService = {
getData: () => {}
}
TestBed.configureTestingModule({
providers: [
{ provide: SomeService, useValue: mockSomeService }
]
})
it('...', () => {
spyOn(mockSomeService, 'getData').and.returnValue({ subscribe: () => {} })
// do stuff
expect(mockSomService.getData).toHaveBeenCalled();
})
在间谍中返回实际的可观察量
spyOn(mockSomeService, 'getData').and.returnValue(Observable.of(someData))
也许这比noop订阅方法更受欢迎,因为如果对服务的调用正在改变组件中的某些内容,那么这可能是你想要测试的东西
执行this post之类的操作。这是我个人经常去的。这只是一个偏好问题。