对于我的生活,我无法让$ httpBackend在一个执行$ http获取请求的控制器上工作。我已经尝试了几个小时=)
我已经将它减少到我可以在下面的最简单的形式。测试通过,如果我
>注释掉控制器中的$ http.get()请求
>在测试中注释出“httpMock.flush()”
并改变“猪”和“狗”匹配
也就是说,这是一个有效的工作测试和应用程序。
应用程序/ JS / app.js
// Declare a module which depends on filters and services. var myApp = angular .module('myApp',['ngRoute','myApp.filters','myApp.services','myApp.directives']) .config(['$routeProvider',function($routeProvider) { $routeProvider .when("/dashboard",{ templateUrl: "partials/dashboard.html",controller: cDashboard }) .otherwise({redirectTo: "/dashboard"}); }]); // Pre-define our main namespace modules. angular.module('myApp.directives',[]); angular.module('myApp.filters',[]); angular.module('myApp.services',[]); angular.module('myApp.controllers',[]);
应用程序/ JS / controller.js
function cDashboard ($scope,$http) { $scope.data = "dog"; // Fetch the actual data. $http.get("/data") .success(function (data) { $scope.data = data }) .error(function () {}); } cDashboard.$inject = [ '$scope','$http' ];
测试/单元/ controllerSpec.js
describe('cDashboard',function(){ var scope,ctrl,httpMock; beforeEach(inject(function ($rootScope,$controller,$http,$httpBackend) { scope = $rootScope.$new(); ctrl = $controller('cDashboard',{$scope: scope}); httpMock = $httpBackend; httpMock.when("GET","/data").respond("pig"); })); it("should get 'pig' from '/data'",function () { httpMock.expectGET("/data").respond("pig"); expect(scope.data).toBe("pig"); }); });
这是我在shell中得到的错误:
INFO [watcher]: Changed file "/home/myApp/test/unit/controller/cDashboard.js". Chrome 26.0 (Linux) cDashboard should get 'pig' from '/data' Failed Error: No pending request to flush ! at Error (<anonymous>) at Function.$httpBackend.flush (/home/myApp/test/lib/angular/angular-mocks.js:1171:34) at null.<anonymous> (/home/myApp/test/unit/controller/cDashboard.js:15:18) Chrome 26.0 (Linux): Executed 1 of 1 (1 Failed) (0.326 secs / 0.008 secs)
您的测试代码有几个问题:
>控制器是在httpMock配置为使用猪响应之前创建的。在实例化控制器之前应该会发生expectGet调用。
> httpMock需要刷新请求
> httMock.when是不必要的,只要你有expectGet
工作实例:http://plnkr.co/edit/lUkDMrsy1KJNai3ndtng?p=preview
describe('cDashboard',controllerService,$httpBackend) { scope = $rootScope.$new(); controllerService = $controller; httpMock = $httpBackend; })); it("should get 'pig' from '/data'",function () { httpMock.expectGET("/data").respond("pig"); ctrl = controllerService('cDashboard',{$scope: scope}); httpMock.flush(); expect(scope.data).toBe("pig"); }); });