【问题标题】:Cannot read property 'subscribe' of undefined after running npm test (Angular 2 unit testing)运行 npm 测试(Angular 2 单元测试)后无法读取未定义的属性“订阅”
【发布时间】:2017-03-01 17:42:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: angular angular2-testing


    【解决方案1】:

    假设你有一个服务,它有一个返回可观察的方法,比如说

    class SomeService {
      getData(): Observable<Data> {}
    }
    

    你可以....

    创建一个间谍1,您可以在其中返回一个带有 noop subscribe 函数的对象。

    let mockSomeService = {
      getData: () => {}
    }
    
    TestBed.configureTestingModule({
      providers: [
        { provide: SomeService, useValue: mockSomeService }
      ]
    })
    
    it('...', () => {
      spyOn(mockSomeService, 'getData').and.returnValue({ subscribe: () => {} })
      // do stuff
      expect(mockSomService.getData).toHaveBeenCalled();
    })
    

    你可以...

    在 spy 中返回一个实际的 observable

    spyOn(mockSomeService, 'getData').and.returnValue(Observable.of(someData))
    

    也许这会比 noop subscribe 方法更受欢迎,因为如果对服务的调用正在更改组件中的某些内容,那么您可能需要测试一下

    你可以...

    this post 中执行类似操作。


    1 - See more about spies

    【讨论】:

    • 谢谢!测试真的让人很困惑
    • 您还可以将 returnValue 动作移动到 mock : let mockSomeService = { getData: () => { return {subscribe: () => {} } } }
    猜你喜欢
    • 2017-06-28
    • 2018-11-11
    • 2018-02-14
    • 2017-04-04
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多