在测试时,angularjs控制器的功能没有执行

时间:2014-10-27 11:30:30

标签: angularjs jasmine karma-runner

我正在使用Jasmine和Karma测试我的angularjs应用程序。

我的测试看起来像这样:

describe('Login test', function() {
  // Mock our module in our tests
  beforeEach(module('Project'));

  var ctrl, scope;
  // inject the $controller and $rootScope services
  // in the beforeEach block
  beforeEach(inject(function($controller, $rootScope) {
    // Create a new scope that's a child of the $rootScope
    scope = $rootScope.$new();

    // Create the controller
    ctrl = $controller('loginController', {
        $scope: scope
    });
  }));

  it('should get login success',function() {
    scope.loginClick('user', 'pass');
  });
});

我有一个带loginClick函数的登录控制器,在这个函数里面我有另一个函数正在发出POST请求。问题是内部函数永远不会执行,我尝试使用console.log()来查看函数是否被调用但没有成功。 我的功能如下:

app.controller('loginController', ['$scope', '$http', '$route', function ($scope, $http, $route) {
  console.log('controller call'); // yes it works
  ...
  $scope.loginClick = function (username, password) {
    console.log('controller call'); // yes it works

    handler.reqPOST('/login', userData, function (result) {
      console.log('login request'); // no output is sent to the console
    });
 };
}]);

处理程序对象在启动时包含在karma配置文件中。

1 个答案:

答案 0 :(得分:0)

首先,除非你有充分的理由,$http是使用angularJS调用后端的方法,它也使它更易于测试。

在任何情况下你都应该模拟帖子,在单元测试中你不想依赖后端

在您的情况下,您可以使用间谍(http://jasmine.github.io/2.0/introduction.html#section-Spies):

describe('Login test', function(){

  beforeEach(module('Project'));      

  var ctrl, scope;

  beforeEach(inject(function($injector) {
    var $controller = $injector.get('$controller');
    var $rootScope = $injector.get('$rootScope');

    scope = $rootScope.$new();

    ctrl = $controller('loginController', {
      $scope: scope,
    });
  }));

  it('test login', function () {

    spyOn(handler, 'reqPOST');

    scope.loginClick('user', 'pass');

    expect(handler.reqPOST).toHaveBeenCalledWith('user', 'pass');
  });
});