Angular测试使用RouteParams的控制器

时间:2014-06-09 14:08:43

标签: angularjs jasmine routes params karma-runner

我需要测试一个使用$routeParams来定义动作的Controller。也许这是一个测试问题,或者我编写控制器的方式是错误的,所以现在我无法编写测试。

这是我的控制器

angular.module('cmmApp')
.controller('UserCtrl', function ($scope, $location, $routeParams, $ionicLoading, $ionicPopup, Userservice) {

    //if a user id is set retrieve user information
    if(typeof $routeParams.id !== 'undefined'){

        var loader = $ionicLoading.show({content: "Retrieving user data"});

        var user = Userservice.get({id: $routeParams.id}).$promise;

        user.then(function(res){
            console.log(res);
            $scope.user = res.user;
            loader.hide();
        });
    }
    //else create an empty resource
    else {
        $scope.user = new Userservice;
    }
});

基本上我只想在提供id为$routeParams的情况下加载资源,否则创建一个空资源。

这是测试:

'use strict';

describe('Controller: UserCtrl', function () {

  // load the controller's module
  beforeEach(module('cmmApp'));

  var UserCtrl,
      scope,
      routeParams;

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope, $routeParams, Userservice) {
    scope = $rootScope.$new();
    routeParams = $routeParams;
    UserCtrl = $controller('UserCtrl', {
      $scope: scope
    });

    console.log("routeParams");
    routeParams = {id: 8490394};
    console.warn(routeParams);
  }));

  it('should create an epmty user', function () {
    console.log(scope.user);
    expect(scope.user).toEqual({});

  });

});

当我运行grunt test业力回复时:

Controller: UserCtrl should create an epmty user FAILED
    Expected {  } to equal {  }.
    Error: Expected {  } to equal {  }.
    at null.<anonymous>    (/Users/carlopasqualicchio/Sites/CMM_Ionic/test/spec/controllers/user.js:28:24)

我想知道如何告诉业力在运行测试之前更改$routeParams.id,并在两个不同的测试中分配不同的值(我需要在第一个中将其设置为null,并将值设置为另一个)。

感谢任何帮助。

谢谢,马特。

1 个答案:

答案 0 :(得分:39)

您可以使用$routeParams(本地对象)的第二个参数传递自定义$controller对象,即与传递$scope的方式相同:

UserCtrl = $controller('UserCtrl', {
    $scope: scope,
    $routeParams: {id: '...'}
});