2014-10-08 4 views
6

Ich habe eine Anwendung mit ng-Tabelle erstellt, die Anwendung funktioniert gut, aber wenn ich einen Jasmin-Test-Fall schrieb ich bin.AngularJS - Mocking ngTableParams in Jasmin-Testfall

Error: [$injector:unpr] Unknown provider: TableParamsProvider 

Kann jemand bitte sagen Sie mir, wie Sie die ngTableParams verspotten und seine Funktionalität testen

Mein Code ist

weiter unten als

Jasmin Testfall

describe('Testing Controllers', function() { 
    describe('Testing WorkController Controller', function() { 
     var WorkController, $scope; 

     beforeEach(module('wsd.workstations')); 

     beforeEach(inject(function($controller, $rootScope) { 
      $scope = $rootScope.$new(); 
      WorkController = $controller('WorkController', { 
       $rootScope: $rootScope, 
       $scope: $scope 
      }); 
     })); 

     it('should searchDocuments when searchDocuments() is called', function() { 
      $scope.searchDocuments(); 
     }); 
    }); 
}); 

Skript

angular.module('wsd', ['restangular', 'ngTable', 'wsd.models', 'wsd.workstations', 'wsd.workperiods', 'ngRoute']) 

.config(function(RestangularProvider, $routeProvider) { 
    RestangularProvider.setBaseUrl('/rest/myuser'); 

    $routeProvider.when('/wd', { 
     templateUrl: 'main/workstation/main.tpl.html', 
     controller: 'WorkController', 
     resolve: { 
      myWorkDocuments: function(Documents) { 
       return Documents.getWorkDocuments(); 
      } 
     } 
    }).when('/wp', { 
     templateUrl: 'main/workperiod/main.tpl.html', 
     controller: 'PeriodController', 
     resolve: { 
      myWorkPeriods: function(Periods) { 
       return Periods.getWorkPeriods(); 
      } 
     } 
    }).otherwise({ 
     redirectTo: '/wd' 
    }); 
}); 

Workstation/main.js

angular.module('wsd.workstations', []) 

.controller('WorkController', function($rootScope, $scope, $filter, ngTableParams) 
{ 
    $scope.myValues = [{name: "Moroni", age: 50}, 
       {name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27}, 
       {name: "Nephi", age: 29}, 
       {name: "Enos", age: 34}, 
       {name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27}, 
       {name: "Nephi", age: 29}, 
       {name: "Enos", age: 34}, 
       {name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27}, 
       {name: "Nephi", age: 29}, 
       {name: "Enos", age: 34}, 
       {name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27}, 
       {name: "Nephi", age: 29}, 
       {name: "Enos", age: 34}]; 

    $scope.tableParams = new ngTableParams({ 
     sorting: { 
      name: 'asc'  
     } 
    }, { 
     getData: function($defer, params) { 
      $scope.myValues = $filter('orderBy')($scope.myValues, params.orderBy()); 
      $defer.resolve($scope.myValues); 
     } 
    }); 


    $scope.searchDocuments = function() 
    { 
     // some other logic 
    }; 
}); 

Antwort

2

Erstens, stellen Sie sicher, dass Sie App auf ngTable abhängt. Ist es im "Haupt"?

nun für den Test:

beforeEach(inject(function($controller, $rootScope, $filter, ngTableParams) { 
    $scope = $rootScope.$new(); 
    WorkController = $controller('WorkController', { 
     $rootScope: $rootScope, 
     $scope: $scope, 
     $filter: $filter, 
     ngTableParams: ngTableParams 
    }); 
})); 

Beachten Sie, wie Sie ausdrücklich jede Abhängigkeit als Parameter für Injektor bereitstellen muss.

edit: igorzg Lösung arbeiten, wenn Sie etwas mit $ scope.tableParams assoziiert nicht testen wollen

anderen bearbeiten: Sie müssen Winkel wissen lassen, was in Ihrem Controller zu injizieren:

.controller('WorkController', ['$rootScope', '$scope', '$filter', 'ngTableParams', function($rootScope, $scope, $filter, ngTableParams) 
{ 
// your controller code here 
}]); 

Ein anderes Problem ist, dass Sie in Ihrem Test laden wsd.workstations Modul, das nicht hat ngTable injiziert. Sie müssen also:

angular.module('wsd.workstations', ['ngTable']) 

OR im Test:

beforeEach(module('wsd')); 

statt:

beforeEach(module('wsd.workstations')); 
+0

Nein, es gibt eine winzige Änderung .... eigentlich ist ng-table innerhalb der main.js definiert ............. unsere ist das Kind dazu, ich habe die ng-route und die hinzugefügt Volles Skript –

+0

auch nicht nur Mocking Ich möchte die Asc-Funktionalität zu testen –

+0

Ich habe die Antwort bearbeitet. Was meinst du mit "Asc-Funktionalität"? – kihu

1

es einfach verspotten, während Sie Instanz

Controller erstellen
function MyNgTableParamsMock() { 

    } 
    beforeEach(inject(function($controller, $rootScope, $filter) { 
     $scope = $rootScope.$new(); 
     WorkController = $controller('WorkController', { 
      $rootScope: $rootScope, 
      $scope: $scope, 
      $filter: $filter, 
      ngTableParams: MyNgTableParamsMock 
     }); 
    })); 
+0

i Reference bin immer: Kann ' t Variable finden: $ Filter –

+0

$ Filter sollte immer da sein, weil sein Teil von angular api, um es machbar zu machen, können Sie Filter vom Spritzen entfernen und Scheinfilter mit etwas leerer Funktion aber filte r sollte immer injizierbar sein. Kannst du deinen Code einfügen? – igorzg