动态覆盖 angular 服务?

Dynamically override angular service?

用例:

I'm writing system tests using Geb/Selenium (so outside of angular). I want to decorate $http to log all requests/responses at run time.

and here's the catch: without touching the source code.

抢先回答"use $provide#decorator",例如

http://blog.xebia.com/2014/08/08/extending-angularjs-services-with-the-decorate-method/

针对此用例的解决方案 意味着将测试挂钩添加到生产代码中...这通常是一件坏事,我希望尽可能避免。

更新:Geb 允许您在浏览器中 运行 Javascript window。所以我只是为了它见鬼 运行 装饰 $http 的教程代码。不幸的是,它没有用,因为显然你不能在加载应用程序后重新配置它。但即使它确实有效,这也引出了另一个有趣的问题——我需要在 任何模块有机会使用它之前覆盖 $http

因为修饰 $http 服务是最干净的方式,你可以通过使用 ng-constants 和 gulp/grunt 之类的东西来避免污染生产代码,只为 'test' 添加修饰代码环境。

在此处查看相关 Q/A:How do I configure different environments in Angular.js?

如果您倾向于在运行时更改它(运行时发生在测试环境中),您可能需要去 'closer to the metal' 并处理 XMLHttpRequests:Add a "hook" to all AJAX requests on a page