从JavaScript代码访问Angular服务实例

时间:2018-03-28 17:23:24

标签: javascript angular testing

我要做的是根据Angular服务中的数据进行一些测试断言,即我们正在尝试创建E2E测试,而我们使用的工具允许我们为断言执行任意JavaScript代码,所以我需要知道是否可以访问Angular服务实例。

如何从纯JS代码访问Angular服务实例?

也就是说,如果我的Angular应用程序已部署,并且我在浏览器中打开应用程序,然后打开Chrome DevTools,我是否可以访问提供给所有组件的Angular服务的服务实例?

我知道可以通过ng.probe($0)等访问您的组件,但不确定服务。

从我到目前为止搜索过的内容来看,似乎我们必须使用Injector类,然后使用它的.get()方法来访问其中一个Angular服务实例,但我是不确定如何访问Injector类/实例本身?

以下是我尝试的内容:ng.probe($0)$0是我的应用的<app-root>)然后我看到返回值有.injector属性,我试过致电ng.probe($0).injector.get('MyServiceName')并收到错误:Uncaught Error: No provider for MyServiceName!

(即使我正在尝试ng.probe以上,我很想知道如何在没有ng.probe的情况下访问注射器,因为在执行自动化测试期间,即prod模式,我不认为我能做ng.probe($0)

所以我不确定我是否正试图以正确的方式访问它?有什么想法吗?

我正在使用Angular 4。

1 个答案:

答案 0 :(得分:2)

这对我来说使用ng.probe()在Angular 7中有效:

window.ng.probe(window.getAllAngularRootElements()[0]) .injector.view.root.ngModule._providers .find(p => p && p.constructor && p.constructor.name === 'MyServiceName');

我想如果没有ng.probe()

,就不可能用另一种方式做