无法阅读财产'订阅'运行npm测试后的未定义(Angular 2单元测试)

时间:2016-10-19 22:05:46

标签: angular angular2-testing

我已经为我正在测试的组件创建了一个测试(规范)文件。但是当我运行测试时,它会给我一个错误说

Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at ComponentUndertest.ngOnInit

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

1 个答案:

答案 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之类的操作。这是我个人经常去的。这只是一个偏好问题。

1 - See more about spies