Javascript AngularJS-模拟jasmine测试用例中的ngTableParams
我使用ng表创建了一个应用程序,该应用程序运行良好,但当我编写jasmine测试用例时,我得到了一个结果Javascript AngularJS-模拟jasmine测试用例中的ngTableParams,javascript,angularjs,jasmine,karma-jasmine,ngtable,Javascript,Angularjs,Jasmine,Karma Jasmine,Ngtable,我使用ng表创建了一个应用程序,该应用程序运行良好,但当我编写jasmine测试用例时,我得到了一个结果 Error: [$injector:unpr] Unknown provider: TableParamsProvider 有人能告诉我如何模拟ngTableParams并测试其功能吗 我的代码如下所示 茉莉花测试用例 describe('Testing Controllers', function() { describe('Testing WorkController Cont
Error: [$injector:unpr] Unknown provider: TableParamsProvider
有人能告诉我如何模拟ngTableParams
并测试其功能吗
我的代码如下所示
茉莉花测试用例
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();
});
});
});
脚本
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'
});
});
工作站/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
};
});
只需在创建控制器实例时模拟它
function MyNgTableParamsMock() {
}
beforeEach(inject(function($controller, $rootScope, $filter) {
$scope = $rootScope.$new();
WorkController = $controller('WorkController', {
$rootScope: $rootScope,
$scope: $scope,
$filter: $filter,
ngTableParams: MyNgTableParamsMock
});
}));
首先,确保您的应用程序依赖于ngTable。它在“主”里面吗 现在进行测试:
beforeEach(inject(function($controller, $rootScope, $filter, ngTableParams) {
$scope = $rootScope.$new();
WorkController = $controller('WorkController', {
$rootScope: $rootScope,
$scope: $scope,
$filter: $filter,
ngTableParams: ngTableParams
});
}));
请注意,您必须显式地将每个依赖项作为injector的参数提供
编辑:如果您不想测试与$scope.tableParams相关的任何内容,igorzg解决方案也会起作用
另一个编辑:您需要让angular知道向控制器中注入什么:
.controller('WorkController', ['$rootScope', '$scope', '$filter', 'ngTableParams', function($rootScope, $scope, $filter, ngTableParams)
{
// your controller code here
}]);
另一个问题是,在测试中,您正在加载wsd.workstations模块,没有注入ngTable。因此,您需要:
angular.module('wsd.workstations', ['ngTable'])
或在您的测试中:
beforeEach(module('wsd'));
而不是:
beforeEach(module('wsd.workstations'));
我收到参考错误:Can't find变量:$filter$filter应该始终存在,因为它是angular api的一部分,为了使其可用,您可以使用一些空函数从inject和mock filter中删除filter,但filter应该始终是可注入的。你能粘贴你的代码吗?没有,有一个微小的变化…实际上ng表是在main.js中定义的………我们的是它的孩子,我添加了ng路由和完整的脚本,而且不仅是模拟我想测试asc功能,我编辑了答案。“asc功能”是什么意思?我们可以测试orderBy sorting吗?我已经看到排序无法工作,因为您试图使用$defer,但没有将其传递给控制器。