angularjs – 如何测试角度装饰器功能
我在Angular中有一个装饰器,它将扩展$log服务的功能,我想测试它,但我没有看到这样做的方法.这是我的装饰者的存根:
angular.module('myApp') .config(function ($provide) { $provide.decorator('$log',['$delegate',function($delegate) { var _debug = $delegate.debug; $delegate.debug = function() { var args = [].slice.call(arguments); // Do some custom stuff window.console.info('inside delegated method!'); _debug.apply(null,args); }; return $delegate }]); }); 请注意,这基本上覆盖了$log.debug()方法,然后在执行一些自定义操作后调用它.在我的应用程序中这是有效的,我看到’内部委托方法!’控制台中的消息.但在我的测试中,我没有得到那个输出. 我该如何测试我的装饰功能? 这是我目前的测试(摩卡/柴,但这不是真正相关): describe('Log Decorator',function () { var MockNativeLog; beforeEach(function() { MockNativeLog = { debug: chai.spy(function() { window.console.log("nmock debug calln"); }) }; }); beforeEach(angular.mock.module('myApp')); beforeEach(function() { angular.mock.module(function ($provide) { $provide.value('$log',MockNativeLog); }); }); describe('The logger',function() { it('should go through the delegate',inject(function($log) { // this calls my mock (above),but NOT the $log decorator // how do I get the decorator to delegate the $log module?? $log.debug(); MockNativeLog.debug.should.have.been.called(1); })); }); });
从附加的plunk(
http://j.mp/1p8AcLT)开始,初始版本是@jakerella提供的(大部分)未触及的代码(对语法进行微调).我试图使用我可以从原始帖子中获得的相同依赖项.注意tests.js:12-14:
angular.mock.module(function ($provide) { $provide.value('$log',MockNativeLog); }); 这完全覆盖了本机$log服务,正如您所期望的那样,使用在测试because 一种解决方案是在配置函数中重新应用装饰器,正如你可以从插件的第2版看到的那样(永久链接会很好,Plunker),tests.js:12-18: angular.mock.module('myApp',function ($injector,$provide) { // This replaces the native $log service with MockNativeLog... $provide.value('$log',MockNativeLog); // This decorates MockNativeLog,which _replaces_ MockNativeLog.debug... $provide.decorator('$log',logDecorator); }); 然而,这还不够.装饰器@jakerella定义替换$log服务的调试方法,导致稍后调用MockNativeLog.debug.should.be.called(1)失败.方法MockNativeLog.debug不再是chai.spy提供的间谍,所以匹配器不起作用. 相反,请注意我在tests.js中创建了一个额外的间谍:2-8: var MockNativeLog,MockDebug; beforeEach(function () { MockNativeLog = { debug: MockDebug = chai.spy(function () { window.console.log("nmock debug calln"); }) }; }); 该代码可能更容易阅读: MockDebug = chai.spy(function () { window.console.log("nmock debug calln"); }); MockNativeLog = { debug: MockDebug }; 这仍然不代表一个好的测试结果,只是一个健全性检查.在几个小时之后敲打你的“为什么不这个工作”问题之后,这是一种解脱. 请注意,我还将装饰器函数重构为全局范围,以便我可以在tests.js中使用它而无需重新定义它.更好的方法是使用$provider.value()重构一个适当的服务,但是这个任务已经留给了学生……还是一个比我自己懒的人. :d (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- [WebService] the namespace on the "definitions&#
- angular – Ionic2 – 在UI上显示项目图像
- angularjs – Angular JS注入新的类实例
- angular-material – 如何将mdButton文本设置为小写?
- gwt-platform使用gwt-bootstrap模态的正确方法是什么?
- 进入docker登录psql数据库对特定表进行操作
- angularjs – AngBind中ngBind,ngBindHtm和ngBindTemplate之
- 解决wireshark在Ubuntu下的权限问题
- bash – tar虽然日志另有说明,但不归档所有文件
- angularjs – 无法为角度动画模块的割草机安装错误找到合适