angularjs – 在Jasmine / Karma中测试$interval
发布时间:2020-12-17 17:50:37 所属栏目:安全 来源:网络整理
导读:我有一个简单的工厂 angular.module('myApp.dice',[]).factory('Dice',['$interval',function($interval){ return { rollDice: function(){ return $interval(function(c){ count++; },100,18,false,0); } };}]); 在我的测试案例中,我有 describe('rolling d
我有一个简单的工厂
angular.module('myApp.dice',[]).factory('Dice',['$interval',function($interval){ return { rollDice: function(){ return $interval(function(c){ count++; },100,18,false,0); } }; }]); 在我的测试案例中,我有 describe('rolling dice',function(){ var promise,promiseCalled = false,notify = false; beforeEach(inject(function(){ promise = Dice.rollDice(); promise.then(function(){ promiseCalled = true; }); })); it('should invoke a promise',inject(function(){ expect(promise).toBeDefined(); })); it('should set promiseCalled',inject(function($rootScope,$interval){ expect(promiseCalled).toEqual(true); })); }); 如何触发间隔或解决承诺?让测试成真? 解决方法
见
plunker
你需要使用angularjs-mocks中的‘$interval.flush’,然后测试结果.我已经冒昧地将计数分配给骰子对象,因为它在您的代码示例中未定义. 使用invokeApply = false调用$interval有什么理由吗?因为那时你必须手动调用$apply. 测试用例是: describe('rolling dice',function(){ var $interval,$rootScope,dice; beforeEach(module('plunker')); beforeEach(inject(function(_$interval_,_$rootScope_,_Dice_){ $interval = _$interval_; $rootScope = _$rootScope_; dice = _Dice_; })); it('should increment count',inject(function(){ dice.rollDice(); // Move forward by 100 milliseconds $interval.flush(100); // Need to call apply because $interval was called with invokeApply = false $rootScope.$apply(); expect(dice.count).toBe(1); })); }); 与工厂: app.factory('Dice',function($interval){ var self= { count: 0,rollDice: function(){ return $interval(function() { self.count++; },0); } }; return self; }]); 编辑:
关键字被通知.从promise API开始,当时的论点是 then(successCallback,errorCallback,notifyCallback) 即,对于$interval的每次迭代,调用第三个回调函数notifyCallback.所以测试看起来像这样: it('should set promiseCalled',function(){ var promiseCalled = false; dice.rollDice().then(null,null,function() { promiseCalled = true; }); $interval.flush(100); $rootScope.$apply(); expect(promiseCalled).toBe(true); }); 如果您想测试已解决的承诺,那么它看起来像这样: it('should resolve promise',function(){ var promiseCalled = false; var resolvedData = null; $q.when('Some Data').then(function(data) { promiseCalled = true; resolvedData = data; }); $rootScope.$apply(); expect(promiseCalled).toBe(true); expect(resolvedData).toBe('Some Data'); }); 我用这些测试用例更新了plunker. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |