我要做的是根据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。
答案 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()