在AngularJS中在运行时以编程方式替换服务

时间:2014-05-21 16:40:51

标签: angularjs dependency-injection angularjs-injector

我想在运行时替换Web应用程序中的一个服务以进行测试。有一个连接到某些本地环境中不可用的外部服务的服务,我想只是执行一个命令来用模拟替换它。

我已经看到我可以通过调用:

在运行时从AngularJS获得任何服务
> angular.element('html').injector().get('myService')

但我想知道是否有办法取代“我的服务”。用其他东西。

我知道创建一个“myServiceWrapper”'暴露了我的服务'允许我通过这样做轻松地替换它:

> angular.element('html').injector().get('myServiceWrapper').myService = new Whatever();

但我想避免对已经有效的应用程序进行更改。

1 个答案:

答案 0 :(得分:2)

你有几个选择。首先,您可以声明一个具有相同名称的新服务(在声明原始服务之后)。由于Angular目前没有命名空间的概念,因此您的新服务将覆盖旧服务。

其次,您可以使用decorator修改部分服务。

最后,ngMockE2E模块还可以让你替换模拟的$ httpBackend,以使用当前存在的服务,但是对任何外部提供商的调用都是存根的。