javascript - 带有注入(inject)服务的单元测试 Angular Controller

标签 javascript angularjs unit-testing jasmine karma-jasmine

在测试 LoginController 时出现所列的错误

LoginController.js

'use strict';

/*Login Module Controllers */

angular.module('loginModule.controller', ['myApp.services', 'ngMd5']).
controller('LoginController', ['$scope', '$location', 'ajaxService', 'userPersistenceService', 'md5', 'toast',
function($scope, $location, ajaxService, userService, md5, toast) {
    $scope.username = '';
    $scope.password = '';
    $scope.loginSuccess = '';
    $scope.login = function() {
        ajaxService.ajaxPostReq({username: $scope.username, password: md5.createHash($scope.password || '')}, 'http://localhost:3000/user/auth', successFunction, errorFunction);
    }
    function successFunction(response) {
        if(response.status == 'success') {
            $scope.loginSuccess = true;
            userService.setUser({userName: response.username, sessionId: response.sessionId});
            $location.path('/home');
            toast.showMessage('Successfully Logged In', response.status);
        } else {
            errorFunction(response);
        }
    }
    function errorFunction(response) {
        $scope.loginSuccess = false;
        toast.showMessage(response.error, response.status);
    }
}]);

LoginController.test.js

describe('Controller: LoginCtrl', function() {
    angular.mock.module('loginModule.controller', []);
    angular.mock.module('myApp.services', []);

    var ctrl, ajaxService, $q;
    beforeEach(inject(function($controller, _$q_, _ajaxService_){
        ctrl = $controller('LoginController');
        $q = _$q_;
        ajaxService = _ajaxService_;
    }));
    describe('Login function', function() {
        beforeEach(function(){
            var deferred = $q.defer();
            spyOn(ajaxService, 'ajaxPostReq').and.returnValue(deferred.promise);
            ctrl.login();
        });

        it('should call ajaxService', function() {
            expect(ajaxService.ajaxPostReq).toHaveBeenCalled();
        });
    });
});

如何正确测试 LoginController?使用上面编写的代码,在单元测试时出现以下错误。

 Chrome 53.0.2785 (Mac OS X 10.12.0) Controller: LoginCtrl Login function should call ajaxService FAILED
 Error: [$injector:unpr] Unknown provider: ajaxServiceProvider <- ajaxService
 http://errors.angularjs.org/1.5.6/$injector/unpr?p0=ajaxServiceProvider%20%3C-%20ajaxService
 at client/app/lib/angular/angular.js:68:12
 at client/app/lib/angular/angular.js:4501:19
 at Object.getService [as get] (client/app/lib/angular/angular.js:4654:39)
 at client/app/lib/angular/angular.js:4506:45
 at getService (client/app/lib/angular/angular.js:4654:39)
 at injectionArgs (client/app/lib/angular/angular.js:4678:58)
 at Object.invoke (client/app/lib/angular/angular.js:4700:18)
 at Object.workFn (client/app/lib/angular/angular-mocks.js:3071:20)
 Error: Declaration Location
 at window.inject.angular.mock.inject (client/app/lib/angular/angular-mocks.js:3033:25)
 at Suite.<anonymous> (client/test/LoginModule/LoginController.js:6:20)
 at client/test/LoginModule/LoginController.js:1:5
 TypeError: Cannot read property 'defer' of undefined
 at Object.<anonymous> (client/test/LoginModule/LoginController.js:13:34)
 TypeError: Cannot read property 'ajaxPostReq' of undefined
 at Object.<anonymous> (client/test/LoginModule/LoginController.js:19:35)
 Chrome 53.0.2785 (Mac OS X 10.12.0): Executed 6 of 6 (1 FAILED) (0 secs / 0.07 secs)
 Chrome 53.0.2785 (Mac OS X 10.12.0): Executed 6 of 6 (1 FAILED) (0.007 secs / 0.07 secs)  

最佳答案

您不是引导您的模块

beforeEach(module('myApp'));

还要检查您是否已将服务包含在 karma.conf.js

files: [

  'app/bower_components/angular/angular.js',
  'app/bower_components/angular-mocks/angular-mocks.js',
  'app/bower_components/angular-ui-router/release/angular-ui-router.js',
  'app/app.js',
  'app/controllers/*.js',
  'app/services/*.js',
  'tests/**/*.js'
],

关于javascript - 带有注入(inject)服务的单元测试 Angular Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40226936/

相关文章:

javascript - 以 MMM d, yyyy 格式对日期进行排序

javascript - 如何在 ReactJS 中设置图片 url

angularjs - nvd3 中的事件处理

javascript - 页面刷新后,ui-router 看不到 url 搜索参数

.net - 如何在 xunit2 中捕获 log4net 输出

javascript - 使用 Jasmine : how to remove or modify spyOn 进行 Angular 单元测试

unit-testing - 如何对业务规则进行单元测试?

javascript - 随机返回三个选项之一的函数,其中所有选项都有完全相同的机会?

javascript - 如何通过 Bootstrap 使用 redux 表单宽度 "Field"

javascript - Angular JS - 模型不更新数字输入字段