单元测试 – 使用$httpBackend单元测试AngularJS控制器

前端之家收集整理的这篇文章主要介绍了单元测试 – 使用$httpBackend单元测试AngularJS控制器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于我的生活,我无法让$ 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");
  });
});

猜你在找的Angularjs相关文章