首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查实例控制器中的函数是否可用,以便在Jasmine中进行单元测试

如何检查实例控制器中的函数是否可用,以便在Jasmine中进行单元测试
EN

Stack Overflow用户
提问于 2017-01-11 16:54:45
回答 1查看 1.6K关注 0票数 0

我第一次尝试在AngularJS中统一一个控制器。我想测试这个控制器中的登录函数是否调用了正确的服务,但是我得到了一个错误,即控制器中不存在这个函数。我做错什么了?我还要嘲笑更多吗?但是,我不应该模拟要测试的控制器中的函数,因为如果我这样做,那么整个测试将是毫无意义的,还是我错了?

控制器-片段:

代码语言:javascript
复制
function LoginController($scope, $state, myService, ngToast) {

    $scope.loginUser = loginUser;

    activate();
    function activate() {}

    function loginUser(credentials) {
       myService.authenticate(/*things*/);
    }
}

测试-代码:

代码语言:javascript
复制
describe('Login Controller', function () {
'use strict';

//globals
var controller, scope;
var $controller, $state, myService, ngToast;

//needed modules
beforeEach(module('app.login'));
beforeEach(module('app.core'));    
beforeEach(module('ui.router'));

//instanciate Controller        
beforeEach(inject(function (_$controller_, _$state_, _myService_,  _ngToast_) {
    scope = {};
    $state = _$state_;
    myService = _myService_;
    ngToast = _ngToast_;

    $controller = _$controller_;

    controller = $controller('LoginCtrl', {
        $scope: scope,
        $state: $state,
        myService: myService,
        ngToast: ngToast
    });
}));

it('should have an existing controller', function () {
    expect(controller).toBeDefined();
});

/*************************** unit-tests ***************************/
describe('.loginUser()', function () {
    it('should exist', function () {
        expect(controller.loginUser).toBeDefined();
    });
});
});

我在运行业力时遇到的错误是:

代码语言:javascript
复制
.loginUser()
  ✗ should exist
TypeError: controller.loginUser is not a function
    at Object.<anonymous> (src/login/login.controller.spec.js:74:31)

但在我看来,控制器确实存在,因为这个测试没有失败:

代码语言:javascript
复制
Login Controller
 ✓ should have an existing controller
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-11 17:34:00

这是因为loginUser是在$scope上定义的,而不是在控制器上定义的,所以loginUser没有绑定到测试中的控制器对象。

要测试loginUser,请执行以下操作:

  • 将$rootScope注入您的beforeEach
  • Set scope = $rootScope.$new()
  • 应使用此范围创建控制器。
  • 您的测试应该检查是否在作用域中定义了loginUser。 描述(‘登录控制器’,函数() {‘使用严格’;//全局变量控制器,范围;var $controller,$state,myService,ngToast;//所需模块beforeEach(‘app.login’);beforeEach(模块(‘app.core’));beforeEach(模块(‘ui.router’));//实例化控制器beforeEach(inject(函数(_$controller_,_$state_,_myService_,_ngToast_,_$rootScope_) ){ scope = _$rootScope_.$new();$state = _$state_;myService = _myService_;ngToast = _ngToast_;$controller = _$controller_;控制器= $controller('LoginCtrl',{ $scope: scope,$state:$state,myService: myService,ngToast: ngToast });});它(‘应该有一个现有控制器’,函数() {expect(控制器).toBeDefined();});/***************************单元-测试*描述(‘.loginUser ()’,函数() {it(‘应该存在’),函数(){ expect(scope.loginUser).toBeDefined();});

如果您想在控制器本身上测试loginUser,那么可以使用控制器作为语法,设置this.loginUser = loginUser,而不是$scope.loginUser = loginUser。然后,您将能够在测试中使用controller.loginUser。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41596455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档