2014-06-09 5 views
23

Ich brauche einen Controller, der $routeParams verwenden, um es Aktion zu definieren. Vielleicht ist es ein Testproblem, oder es ist falsch, wie ich den Controller geschrieben habe, also kann ich jetzt keinen Test schreiben.Angular Test eine Steuerung, die RouteParams

Hier ist mein 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; 
    } 
}); 

Grundsätzlich nur laden ich eine Ressource wollen, wenn eine ID zur Verfügung gestellt $routeParams ist, sonst eine leere Ressource erstellen.

Und hier ist der 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) 

Ich wonering wie Karma sagen $routeParams.id vor einem Test zu ändern, zu laufen und zu:

'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({}); 

    }); 

}); 

Wenn ich grunt test Karma Antwort laufen ein anderer Wert in zwei verschiedenen Tests (ich muss es auf Null im ersten und auf einen Wert für den anderen setzen).

Jede Hilfe wird geschätzt.

Danke, Matt.

+0

Haben Sie versucht, einen Wert zu '$ routeParams.id' Zuweisen ? –

Antwort

37

Sie ein benutzerdefiniertes $routeParams Objekt passieren kann das zweite Argument von $controller mit (Einheimischem Objekt), dh die gleiche Art und Weise übergeben Sie die $scope:

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

Das funktioniert, also habe ich die Funktion beschrieben, um meinen Controller mit und ohne Params zu testen. Danke vielmals. – teone

Verwandte Themen