如何在控制器中对调用工厂服务的函数进行单元测试(使用Jasmine),该服务将返回承诺

普拉莫

在下面的SampleController中,如何对postAttributes函数调用sampleService.updateMethod进行单元测试自从updateMethod返回Promise以来,我遇到了麻烦。

    angular.module('sampleModule')
       .controller('SampleController', SampleController);

    SampleController.$inject =['sampleService'];

    function SampleController(sampleService){

    this.postAttributes = function() {    
        sampleService.updateMethod(number,attributes)
            .then(function(response){
                //do something on successful update
            },function(response){
                //do something on unsuccessful update
            });
        }; 

    }

这是我所拥有的工厂服务:

    angular.module('sampleModule')
        .factory('sampleService', sampleService);

    sampleService.$inject = ['$http'];

    function sampleService($http) {
        return {
            getMethod: function(acctNumber){
                return $http({
                    method: 'GET',
                    url: //api endpoint
                });
            },
            updateMethod: function(number, attributes){
                return $http({
                    method: 'PUT',
                    url: //api endpoint,
                    data: //payload
                });
            }
        };
    }

我想在控制器规范中模拟工厂服务,而不是将实际服务直接注入$ controller,因为大多数单元测试指南都指定要在隔离下测试单元。

样例控制器规格:

    describe('SampleController Test', function(){
        var $controller;
        var service;

        beforeEach(angular.mock.module('sampleModule')); 

        beforeEach(angular.mock.inject(function(_$controller_){
            $controller = _$controller_;
        }));

        it('Testing $scope variable', function(){
            var sampleController = $controller('SampleController', { 
                sampleService: service, //mocked factory service 
            });

            sampleController.postAttributes(); //calling the function first
            //here I would like to make an assertion to check if
            //sampleService.updateMethod has been called with certain parameters                        
            //how do I do that??
        });

    });
普拉莫

谷歌搜索并找到了一种模拟工厂服务的解决方案,并遵循了像@TehBeardedOne这样的承诺创建方法,并使其从模拟服务中返回。

    describe('SampleController', function(){

        var mockService, controller, deferred, $rootScope;

        beforeEach(function(){

            angular.mock.module('sampleModule');

            angular.mock.module(function($provide){
                $provide.factory('sampleService', function($q){
                    function updateMethod(acct, attr){
                        deferred = $q.defer();
                        return deferred.promise;
                    }
                    return{updateMethod: updateMethod};
                });
            });

            angular.mock.inject(function($controller, sampleService, _$rootScope_){
                $rootScope = _$rootScope_;
                mockService = sampleService;
                spyOn(mockService, 'updateMethod').and.callThrough();
                controller =$controller('SampleController', {
                    sampleService: mockService,
                })
            });
        });

        it('postAttributes function should call updateMethod', function(){

            controller.postAttributes();
            expect(mockService.updateMethod).toHaveBeenCalled();
            expect(mockService.updateMethod).toHaveBeenCalledWith(controller.accountNumber, controller.attributes);
        });

        it('postAttributes success block', function(){
            controller.postAttributes();
            var res = {
                data: '2323'
            }
            deferred.resolve(res);
            $rootScope.$digest();
            expect(//something in success block).toBe(something);
        });

        it('postAttributes failure block', function(){
            controller.postAttributes();
            var res = {
                data: '9898'
            }
            deferred.reject(res);
            $rootScope.$digest();
            expect(controller.lame).toBe('dont type shit');
        });

    });

我嘲笑sampleService$提供商的服务并取得updateMethod返回使用一个承诺$ Q稍后,您可以解决或拒绝诺言,并逐个测试成功和失败的障碍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Cordapp中对服务和控制器(kotlin)进行单元测试?

如何在控制器建议中模拟服务以进行单元测试

如何在单元测试中通过茉莉花间谍将拒绝/失败的承诺返回给角度控制器

对调用外部服务的类进行单元测试

单元测试使用承诺的角度控制器和服务?

在AngularJS中调用服务并使用Karma和Jasmine进行测试后,Angularjs单元测试未达到目标,然后成为控制器的一部分

如何对调用getJSON的JavaScript函数进行单元测试

如何对返回模型的控制器进行单元测试?

返回承诺Angularjs Jasmine的单元测试服务

使用服务方法进行单元测试节点js控制器的最佳方法是什么

如何从AngularJS中的控制器调用工厂/服务?错误:组件$ injector中的未知提供程序错误

Angularjs和Jasmine:使用进行Ajax调用的服务测试控制器

如何编写Karma测试以查看Angular中的控制器是否正在调用工厂函数?

Angular 服务中的单元测试 $q 承诺 - Karma、Jasmine

如何使用AngularJS在控制器中调用服务函数?

如何对服务的构造函数中调用的函数进行单元测试?

AngularJS中的控制器中的单元测试承诺

如何在Play Framework 2 Scala中对控制器进行单元测试

如何在ASP.NET Core 1.1中对使用HttpContext的MVC控制器进行单元测试

如何对AngularJS服务/工厂进行单元测试

如何在角度单元测试中模拟函数中的服务调用?

如何在xUnit和nSubstitute中对服务调用进行单元测试

单元测试无效控制器和服务方法

如何对调用 void 方法的方法进行单元测试?

模拟控制器进行单元测试,无需任何服务引用 C#

春季-使用模拟单元测试-如何在服务单元测试中模拟自定义收集器

如何在单元测试控制器最小起订量上下文中跳过调用函数?

如何在不使用 Angular 中的 spyOn 的情况下检查 Jasmine 单元测试中是否调用了来自服务的方法?

在Vuex + Jest中,如何对调用商店的吸气剂进行单元测试?