6 Stimmen

AngularJS - ngTableParams in einem Jasmin-Testfall fälschen

Ich habe eine Anwendung mit ng-table erstellt, die Anwendung funktioniert gut, aber wenn ich einen Jasmine-Testfall schreibe, erhalte ich.

Fehler: [$injector:unpr] Unbekannter Anbieter: TableParamsProvider

Kann mir bitte jemand sagen, wie ich das ngTableParams mocken und seine Funktionalität testen kann

Mein Code lautet wie folgt

Jasmine-Testfall

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

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

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

        it('soll searchDocuments aufgerufen werden, wenn searchDocuments() aufgerufen wird', 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
    };
});

2voto

kihu Punkte 842

Zuerst stellen Sie sicher, dass Ihre App von ngTable abhängt. Befindet sie sich innerhalb von 'main'?

Jetzt zum Test:

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

Bemerken Sie, wie Sie jedes Abhängigkeit explizit als Parameter für den Injector bereitstellen müssen.

Bearbeiten: igorzg Lösung funktioniert auch, wenn Sie nichts testen möchten, was mit $scope.tableParams verbunden ist.

Weitere Bearbeitung: Sie müssen Angular mitteilen, was in Ihren Controller injiziert werden soll:

.controller('WorkController', ['$rootScope', '$scope', '$filter', 'ngTableParams', function($rootScope, $scope, $filter, ngTableParams)
{ 
 // Ihr Controller-Code hier
}]);

Ein weiteres Problem ist, dass Sie in Ihrem Test das Modul wsd.workstations laden, in dem kein ngTable injiziert ist. Sie müssen also:

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

ODER in Ihrem Test:

beforeEach(module('wsd'));

anstatt:

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

1voto

igorzg Punkte 1468

Belustigen Sie sich einfach darüber, während Sie eine Controller-Instanz erstellen

    function MyNgTableParamsMock() {

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X