【问题标题】:AngularJS Jasmine spy provided factory and callthroughAngularJS Jasmine spy 提供工厂和调用
【发布时间】:2014-07-29 22:37:06
【问题描述】:

我想提供我自己的功能来替换工厂,我还希望能够使用.and.callThrough() 来使用原始功能。我遇到的主要问题是我无法将工厂注入到模拟模块语句中。

describe("It", function() {
    var mockFactory;

    //This works, but the original functionality is gone at this point because I'm overriding it with $provide
    beforeEach(angular.mock.module('myModule', function($provide) {
        mockFactory = jasmine.createSpy('myFactory');
        $provide.factory('myFactory', function() { return mockFactory });
    }));

    //This fails because I cant inject the actual factory into the module mock
    beforeEach(angular.mock.module('myModule', function($provide, myFactory) {
        mockFactory = jasmine.createSpy('myFactory', myFactory);
        $provide.factory('myFactory', function() { return mockFactory });
    }));

})

关于如何克服这个问题的任何想法?提前致谢!

【问题讨论】:

    标签: angularjs jasmine karma-runner karma-jasmine


    【解决方案1】:

    您可以像这样使用$provide.decorator()

    describe('It', function() {
       var mockFactory;
    
       beforeEach(module('myModule', function ($provide) {
         $provide.decorator('myFactory', function ($delegate) {
           mockFactory = jasmine.createSpy('myFactory', $delegate).and.callThrough();
           return mockFactory;
         });
       }));
    
       it('should call through', function () {
         mockFactory('foo', 'bar');
         expect(myFactory).toHaveBeenCalled();
       });
    });
    

    希望这会有所帮助。

    【讨论】:

    • 我的工厂没有方法,它返回一个函数。 .factory('myFactory', function() { return function() { ... }; })
    • 好的,我试试看。你能解释一下这个 $delegate 魔术吗?
    • 很高兴我能帮上忙 :) 我认为装饰器是一个鲜为人知的功能,特别适用于在开发过程中测试或注入测试数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2018-01-20
    • 2016-02-18
    • 2015-07-22
    • 2014-10-11
    • 2016-09-09
    相关资源
    最近更新 更多