AngularJS在配置块中模拟$ logProvider

时间:2013-05-31 17:39:40

标签: unit-testing angularjs dependency-injection jasmine karma-runner

有没有办法在使用Karma(Testacular)和Jasmine以角度编写单元测试时注入提供者?

我们的团队最近决定使用angularjs $ log将调试详细信息写入控制台。这样我们就可以利用$logProvider.debugEnabled()方法禁用日志记录的功能。

angular.module("App", ["prismLogin", "ui.bootstrap"])
    .config(["$routeProvider", "$logProvider", 
     function ($routeProvider, $logProvider) {
         $routeProvider
         //routes here edited for brevity

         //This is the offending line, it breaks several pre-existing tests
         $logProvider.debugEnabled(true);
     }]);

但是,在添加$logProvider.debugEnabled(true);行之后,我们的几个测试不再成功执行,但失败并显示以下消息:

TypeError: Object doesn't support property or method 'debugEnabled' from App

再次提出我的问题,是否有可能嘲笑$logProvider?或者我应该为测试工具提供自己的配置块吗?

我试图寻找一种模拟app模块的方法,但没有运气。在我看来,使用具体的应用程序模块而不是模拟是非常脆弱的。每次在应用程序中进行更改或运行配置块时,我都希望避免重新处理与app模块关联的测试。

失败的测试是与$logProvider无关的代码单元?我觉得好像我在这里遗失了一些东西,让事情变得比他们应该的更难。如何编写灵活且不受应用程序中引入的其他副作用影响的测试?

1 个答案:

答案 0 :(得分:2)

这似乎是know issue带角度模拟。

在问题得到解决之前,我能够通过在第295行的angular-mocks.js中的angular.mock.$LogProvider定义中添加以下方法来解决此问题。

this.debugEnabled = function(flag) {
   return this;
};