jak*_*lla 7 testing angularjs angularjs-decorator
我在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
}]);
});
Run Code Online (Sandbox Code Playgroud)
请注意,这基本上覆盖了该$log.debug()
方法,然后在执行一些自定义操作后调用它.在我的应用程序中这是有效的,我'inside delegated method!'
在控制台中看到了消息.但在我的测试中,我没有得到那个输出.
我该如何测试我的装饰器功能?
具体来说,我如何注入我的装饰器,以便它实际装饰我的$log
模拟实现(见下文)?
这是我目前的测试(摩卡/柴,但这不是真正相关):
describe('Log Decorator', function () {
var MockNativeLog;
beforeEach(function() {
MockNativeLog = {
debug: chai.spy(function() { window.console.log("\nmock debug call\n"); })
};
});
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);
}));
});
});
Run Code Online (Sandbox Code Playgroud)
从附带的插件(http://j.mp/1p8AcLT)开始,初始版本是@jakerella提供的(大多数)未触及的代码(对语法进行微调).我试图使用我可以从原始帖子中获得的相同依赖项.注意tests.js:12-14
:
angular.mock.module(function ($provide) {
$provide.value('$log', MockNativeLog);
});
Run Code Online (Sandbox Code Playgroud)
这完全覆盖了本机$log
服务,正如您所期望的那样,MockNativeLog
在测试开始时提供的实现因为angular.mock.module(fn)
充当模拟模块的配置函数.由于配置功能以FIFO顺序执行,因此该功能破坏了装饰的$log
服务.
一个解决办法是重新申请的装饰里面是配置的功能,你可以从普拉克第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);
});
Run Code Online (Sandbox Code Playgroud)
然而,这还不够.装饰器@jakerella定义了替换服务的debug
方法$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 call\n");
})
};
});
Run Code Online (Sandbox Code Playgroud)
该代码可能更容易阅读:
MockDebug = chai.spy(function () {
window.console.log("\nmock debug call\n");
});
MockNativeLog = {
debug: MockDebug
};
Run Code Online (Sandbox Code Playgroud)
这仍然不代表一个好的测试结果,只是一个健全性检查.在几个小时之后敲打你的"为什么不这个工作"问题之后,这是一种解脱.
请注意,我还将装饰器函数重构为全局范围,以便我可以在tests.js
不必重新定义它的情况下使用它.更好的方法是重构一个适当的服务$provider.value()
,但是这个任务已经留给了学生......或者是一个比我更懒的人.:d
归档时间: |
|
查看次数: |
3078 次 |
最近记录: |