【发布时间】:2014-04-24 15:31:33
【问题描述】:
我在 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() 方法,然后在执行一些自定义操作后调用它。在我的应用程序中这是可行的,我在控制台中看到了 'inside delegated method!' 消息。但在我的测试中,我没有得到那个输出。
如何测试我的装饰器功能?
具体来说,我怎样才能注入我的装饰器,使它真正装饰我的 $log 模拟实现(见下文)?
这是我目前的测试(mocha/chai,但这并不相关):
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);
}));
});
});
【问题讨论】:
-
但是这个想法(如果我没记错的话)是你装饰你的
$log,然后你用一个模拟覆盖整个$log。所以很明显,在您的测试中,您将拥有一个带有简单debug函数的函数。我想我一路上错过了一些东西。 -
我为你创建了一个 plunker,我不得不对 angular-mock 进行一些修改,但请查看:plnkr.co/edit/kim2NTNBp0eflOhFVhF3?p=preview
-
也开始制作plunker。请注意,对
angular.module()的调用需要两个 参数... -
Plunk 使用 Angular JS 1.2.x,Mocha、Mocha、Chai 和 Chai Spies 的 Angular Mocks:j.mp/1p8AcLT
-
有趣的想法。谢谢!我会看看,看看我能做什么。另外,@al-the-x,在我的代码中,装饰器在它自己的文件中,所以不需要
angular.module()上的第二个参数,但无论如何都很好!
标签: angularjs testing angularjs-decorator