web-dev-qa-db-ja.com

Angular RouteParamsを使用するコントローラーをテストする

$routeParamsを使用してアクションを定義するコントローラーをテストする必要があります。たぶん、それはテストの問題であるか、コントローラーの書き方が間違っているので、今はテストを書くことができません。

これが私のコントローラーです

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を変更し、2つの異なるテストで異なる値を割り当てるようにカルマに指示する方法を知りたいです(最初のテストではnullに設定し、もう一方のテストでは値に設定する必要があります)。

どんな助けでも大歓迎です。

ありがとう、マット。

24
teone

$routeParams(ローカルオブジェクト)の2番目の引数を使用して、カスタム$controllerオブジェクトを渡すことができます。つまり、$scopeを渡すのと同じ方法です。

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