运行npm测试后无法读取未定义的属性'subscribe'(Angular 2单元测试)

Aig*_*guo 27 angular2-testing angular

我为我正在测试的组件创建了一个测试(spec)文件.但是当我运行测试时,它给出了一个错误说法

Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at ComponentUndertest.ngOnInit
Run Code Online (Sandbox Code Playgroud)

这是显而易见的,因为我已经在ngOnInit()方法中订阅了某些内容,但是我可以在测试期间忽略订阅吗?或者我可以在测试期间伪造订阅吗?我已经搜索了很多关于这个问题但是找不到与angular2测试有关的任何内容.提前致谢.

Pau*_*tha 39

假设你的服务有一个返回一个observable的方法,比如说

class SomeService {
  getData(): Observable<Data> {}
}
Run Code Online (Sandbox Code Playgroud)

你可以....

创建spy1,返回具有正午订阅功能的对象.

let mockSomeService = {
  getData: () => {}
}

TestBed.configureTestingModule({
  providers: [
    { provide: SomeService, useValue: mockSomeService }
  ]
})

it('...', () => {
  spyOn(mockSomeService, 'getData').and.returnValue({ subscribe: () => {} })
  // do stuff
  expect(mockSomService.getData).toHaveBeenCalled();
})
Run Code Online (Sandbox Code Playgroud)

你可以...

在间谍中返回一个实际的观察者

spyOn(mockSomeService, 'getData').and.returnValue(Observable.of(someData))
Run Code Online (Sandbox Code Playgroud)

也许这比noop订阅方法更受欢迎,因为如果对服务的调用正在改变组件中的某些东西,那么这可能是你想要测试的东西

你可以...

做一些像这篇文章.这是我个人经常去的.这只是一个偏好问题.


1 - 查看有关间谍的更多信息

  • 谢谢!测试真的让人感到困惑 (4认同)
  • 您还可以将 returnValue 操作移动到 mock : let mockSomeService = { getData: () =&gt; { return {subscribe: () =&gt; {} } } } (4认同)