繁体   English   中英

Angular Karma单元测试控制器未注入模拟服务依赖项

[英]Angular Karma Unit Testing Controller Not Injecting Mocked Service Dependency

我尝试了各种方法来实例化模拟服务“ listFilterManager”并将其传递给控制器​​。 尽管已创建并访问了模拟服务,但是当执行scope。$ digest()时,将运行实际的非模拟服务,而不是模拟listFilterManager。 更令人困惑的是,resourceStore服务已正确模拟和注入。 任何帮助将不胜感激。

相关代码:

    beforeEach(function(){
        module('listModule');
        module(function($provide){
            $provide.factory('resourceStore', function(){
                return {
                    alertsArray: Object.keys(mockData).map(function(key){
                        return mockData[key];
                    })
                };
            });
            $provide.value('listFilterManager',{
                filterList: jasmine.createSpy('filterList').and.callFake(function(input){
                    return input;
                })
            });
        });
    });

    describe('instantiates the Alert List Ctrl', function(){
        var scope, listFilterParams, listFilterManager, resourceStore, tableAccessorDictionaries, AlertListCtrl;
        beforeEach(function(){
            inject(function(_$rootScope_, $controller, _tableAccessorDictionaries_, _listFilterParams_, _resourceStore_, _listFilterManager_){
                scope = _$rootScope_.$new();
                listFilterParams = _listFilterParams_;
                listFilterManager = _listFilterManager_; //this refs the mocked service, but the actual service is the one that is executed.
                var deps = {
                    '$scope': scope,
                    'tableAccessorDictionaries': _tableAccessorDictionaries_,
                    'listFilterManager': _listFilterManager_,
                    'listFilterParams': _listFilterParams_,
                    'resourceStore': _resourceStore_
                };
                AlertListCtrl = $controller('AlertListCtrl', deps);
            });
        });

        it('it should filter the list when a list filter parameter changes', function(){
            expect(listFilterManager.filterList).not.toHaveBeenCalled();
            scope.filterParams.text = 'This is a test query';
            scope.$digest();
            expect(listFilterManager.filterList).toHaveBeenCalled();
        });

    });

因此,您说的是“ listFilterManager”是一项服务,但是在beforeEach方法中,您将其作为值提供。 您需要将其作为工厂提供,以便对其进行正确模拟。 替换以下

               $provide.value('listFilterManager',{
            filterList: jasmine.createSpy('filterList').and.callFake(function(input){
                return input;
            })
        });

与:

               $provide.factory('listFilterManager', function () {
                 return {
                   filterList: jasmine.createSpy('filterList').and.callFake(function(input){
                     return input;
                 };
               })
        });

它应该可以正常工作。

一段时间后,我想通了。 问题是因为我正在测试的功能是从underscore.debounce包装器中调用的。 防抖动显然会导致测试问题,如所描述这里 解决方案是这样在测试文件中重新定义_.debounce(贷记至上述文章):

_.debounce = function (func) { return function () { func.apply(this, arguments);}; };

哦,这是一个令人沮丧的问题,但是希望这可以帮助需要帮助的其他人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM