describe('Controllers: CheckListOverCtrl', function () { var $scope, ctrl, $httpBackend; beforeEach(angular.mock.module('app.audit')); beforeEach(angular.mock.inject(function ($rootScope, $controller, _$httpBackend_) { $httpBackend = _$httpBackend_; $httpBackend.when('GET','/Services/AuditWebForm.aspx/GetCheckListOver'). respond([{ name: 'name1', ProjectName: "ProjectName1", I_Category: "I_Category1", uName: "uName1", dName: "dName1", D_Create: "D_Create1" }, { name: 'name2', ProjectName: "ProjectName2", I_Category: "I_Category2", uName: "uName2", dName: "dName2", D_Create: "D_Create2" }]); $scope = $rootScope.$new(); ctrl = $controller('CheckListOverCtrl', { $scope: $scope }); })); it("标题测试", function () { expect($scope.$root.title).toBe('已审列表'); }); it("取数据测试", function () { $httpBackend.flush(); expect($scope.list.length).toBe(2); }); });
这是我写的测试代码。 我想测试$scope.list 这样写错在哪里?
还有。 我想问下, 测试纸能写这种假返回值吗? 可以通讯后台方法吗? 要怎么写呢??
你用的是什么测试框架?话说,我都没写过测试~
就写spec文件 再跑茉莉花。
@战马: https://docs.angularjs.org/api/ngMock/service/$httpBackend,你看这个文档~
@幻天芒: 需要翻~~~~墙?
@战马: 额,不急的话,我中午分析看看,现在正在fix bug~
@幻天芒: 好的。 谢谢
@战马: 看了下,好像没错样,出现什么错误了吗?
@幻天芒: Cannot read property 'length' of undefined
一直在报错~~
@战马: 看你的controller中有个data.d,你这边构造的数据集合是不是应该放到d这个属性上去?你可以在expect($scope.list.length).toBe(2);上打个断点,看下list到底是个啥?
@幻天芒: 断点到不了expect这句,在flush()就报错了Cannot read property 'length' of undefined。
你这边构造的数据集合是不是应该放到d这个属性上去? 这句话怎么操作啊?
@战马: 就是说你Mock的数据一定要和真实数据的格式保持一致。
试下,在flush之前加上:$httpBackend.expectGET('/Services/AuditWebForm.aspx/GetCheckListOver');
@幻天芒: 还是一样的 。response里面我现在是data.d=[{...}] 这样了。还是报一样的问题Cannot read property 'length' of undefined。
@战马: 怎么解决问题的??
@幻天芒:
expect($scope.list.length).toBe(0); $httpBackend.expectPOST('/Services/AuditWebForm.aspx/GetCheckList').respond(data); $httpBackend.flush(); expect($scope.list.length).toBe(2);
·先写好expectpost 再执行flush的时候就会按你写的expectpost来操作 ,截取请求 返回data
@战马: 呵呵~原来你是POST请求嗦...
@战马: 看你mock的是get请求呢,为什么你在这儿用expectPOST?用expectGET不行么?
@幻天芒: get post 都试过 。 最后只有这种才能跑出来结果。。。。
@战马: 有点奇怪,不清楚了。
$scope.list的定义哪去了
$scope.list是在controller里,具体代码:
//获得数据列表 $scope.getlist = function (current, pagesize) { return $http.post('/Services/AuditWebForm.aspx/GetCheckListOver', { Current: current, pageSize: pagesize, findValue: $scope.query }).success(function (data) { $scope.list = angular.fromJson(data.d); if ($scope.list.length > 0) { if ($scope.list[0].Total > 0) { $scope.PageCount = ($scope.list[0].Total / $scope.pageSize); $scope.PageCount = (($scope.list[0].Total % $scope.pageSize) != 0 ? parseInt($scope.PageCount) + 1 : $scope.PageCount); $scope.PageCount = ($scope.PageCount == 0 ? 1 : $scope.PageCount); } nameConverter.ChangeUser(); } }).error(function () { $scope.list = ""; }); }