【问题标题】:Testing observable from angular service, angular4测试从角度服务观察到的,angular4
【发布时间】:2018-10-30 06:46:25
【问题描述】:

我想测试 Observable 的返回数据,在 Angular 组件中。

我创建了一个 slackblitz https://stackblitz.com/edit/observable-testing-101

这里可以看到组件+服务的逻辑。

我的测试代码也包含在 slack 中。

在我的本地 m/c 上,我遇到了错误:Expected undefined to be 1.

请帮忙,我是测试角度的新手。

【问题讨论】:

  • 你什么时候得到这个异常?
  • 在 ng 测试中,我得到了这个

标签: angular


【解决方案1】:

注意:在 stackblitz 中进行测试需要与上述不同的设置。我已将您的数据复制到此处的 Angular Stackblitz 测试环境中: https://stackblitz.com/edit/stackoverflow-q-53039354?file=app%2Fmy.component.spec.ts

由于您使用的是 Angular 4,我必须安装 rxjs.compat 才能在 stackblitz 中运行您的代码,因为我在那里使用的是 Angular 7。

设置完成后,我遇到的第一件事是:

Failed: <spyOn> : getPostObservable() method does not exist 
Usage: spyOn(<object>, <methodName>)

果然,getPostObservable() 不存在于你放在 stackblitz 中的 data.service.ts 文件中。但是,getTodoObservable() 确实存在,所以我将测试更改为指向该函数。

然后我收到了你上面提到的消息:

Expected undefined to be 1

我注意到您有两个 fixture.detectChanges() 实例,一个在规范之前的 beforeEach() 中,另一个在规范中的“应该从可观察到的待办事项”中。第一次调用 fixture.detectChanges 时,它将调用生命周期挂钩进行初始化,并且 ngOnInit() 将被执行,因此在调用它之前,要小心设置了需要在 ngOnInit() 中使用的任何间谍。我注释掉了第一个调用,现在测试可以工作了。

我还注释掉了“whenStable”,因为这里也不需要它 - 您正在返回一个带有“of”的 observable,它会立即解决,所以不需要这个。我还注释掉了您对 console.log(this.response) 的调用,因为您没有定义响应对象并且它在控制台输出中给出了“未定义”。我还添加了 console.log(component) ,因为当我试图弄清楚为什么组件看起来不像我期望的那样时,我发现这对输出很有用。 (如果您不知道,请单击开发服务器测试窗口底部的“控制台”一词以打开控制台日志。)

最后一个观察:我真的不喜欢看到 NO_ERRORS_SCHEMA 被用于测试。我自己从不使用它,因为它倾向于通过不报告它们来覆盖实际问题,我希望看到它们并修复它们。 :)

【讨论】:

  • 非常好,先生。非常感谢,我真的很感谢你付出的辛勤工作,让事情顺利进行和解释。再次感谢。还有一个问题,我如何使用提供者:[{provide: DataService, useClass: MockDataService}], in this.
  • 在 StackOverflow 上的所有其他用户都给了我之后,我很高兴回馈一些东西 - 向前支付等等。 :) 我用我将如何做到这一点更新了 stackblitz。注意:我使用了{provide: DataService: useValue: mockDataService},使用 useValue 而不是 useClass。我还用const mockDataService = jasmine.createSpyObj({ getTodoObservable: of(responseObservable) }); 创建了上面的模拟(真的是一个间谍)现在不需要SpyOn 服务,你已经注入了间谍。我喜欢保持简单。
  • 谢谢,我明白了,但只是问,是否可以使用 useClass,所有方法,而不是 useValue。如果是,那么如何。如果可能,请制作新的 spec.ts 文件。
  • 好的,我重命名了旧的 .spec 文件,(它被称为“old-my-component-spec.ts”)。我添加了一个模拟类并注入了它。那是你要找的吗?请注意,规范中的 spyOn 现在执行 .and.callThrough() 而不是返回不同的值。您要实现多少实际类取决于您要测试的内容。注意 - 这是组件的规范,而不是服务。我相信你会通过模拟 Http 对服务进行单元测试,但你不想在组件测试中这样做。
  • 优秀的先生,我希望我能和你聊聊一些问题,但这样的要求太多了。再次非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多