我正在为AngularJS UI网格编写Jasmine单元测试。我有一个下面的UI网格函数在我的控制器代码:
$scope.gridOption.onRegisterApi = function(gridApi) {
$scope.gridApi.core.on.sortChanged($scope, function(grid, sortColumns) {};
gridApi.pagination.on.paginationChanged($scope, function(newPage, pageSize) {};
};
我不知道如何为这个函数写单元测试用例&内部私有函数....
有谁能帮我一下吗?提前感谢!!
首先需要$compile ui-grid,然后是scope。这样您就可以在测试中访问gridApi方法,例如:
scope.myGridApi.selection.getSelectedRows();
步骤1。
createMycontroller(); // after you have configured and injected dependencies
步骤2。编译ui grid:
var gridContainer = "< div ui-grid="myGridOptions" ui-grid-pagination></div>";
var grid = $compile(gridContainer)(scope); // I've declared scope before as scope = $rootScope.$new();
scope.$digest();
在这个阶段ui网格应该编译在我的情况下,myGridApi是在范围
步骤3通过raise方法触发paginationChanged。
scope.myGridApi.pagination.raise.paginationChanged();
我在ui网格单元测试中发现了raise方法:https://github.com/angular-ui/ui-grid/blob/9d1a0b46e54983e09e0be8f89f9fac0ee74046e4/test/unit/core/factories/GridApi.spec.js#L26作为API文档的一部分:
http://ui-grid.info/docs//api/ui.grid.class: GridApi
当你注册一个事件时,它将:
"事件将得到一个。raise和。on。.raise.eventName() -不接受参数"
您不能对未在作用域上声明或可通过属性访问的方法进行单元测试。有些人使用_来命名私有方法。
这是有意义的——你在测试最终输出,你不是在测试"内部"——内部要么是外部库,它们自己进行单元测试,要么是私有方法,你可以通过公共方法的不同参数推送(否则它们的存在是值得怀疑的)。
如果外部动作模拟是你的目标,那么就使用间谍:https://www.youtube.com/watch?v=0EXBpsz9Bwc
UPDATE -服务测试示例
describe('myService', function () {
'use strict';
beforeEach(function () {
// module that we are testing
module('appServices');
});
it('myMethodName - should return empty array if called with null', inject(function (myService) {
expect(myService.myMethodName(null)).toBe([]);
}));
});
Ctrl测试:https://www.youtube.com/watch?v=sZp9Hz3bHZE .
那里有一套完整的视频-只需下载/复制代码并在本地运行即可查看确切的用例。Spies基本上允许你对外部服务/引用的请求进行劫持,并模拟响应——所以当你的方法调用外部服务时,它会返回你的响应,而不是实际调用该服务,因此你可以评估方法应该返回什么。