1

我正在尝试使用茉莉花测试我的控制器。基本上,当控制器被创建时,它会调用一个服务来发出 http 请求。我正在使用 httpBackend 来获取假数据。当我尝试运行测试时,我总是收到错误“没有待处理的刷新请求”。如果我删除 httpBackend.flush() 则测试失败,因为 controller.data.name 未定义。谁能知道为什么会这样?谢谢。

该模块的代码在这里:

var myModule = angular.module('myModule', ['ngMockE2E']);
myModule.run(function($httpBackend){
  $httpBackend.whenGET('/Person?content=Manager').respond(function (){
     var response = {'name':'Bob','age':'43'}
     return [200,response];
  })
});

服务代码:

myModule.factory('myService',function($http){
     return {
        getData: function(position){
             return  $http.get('/Person?content='+position); 
        }
     }
});

控制器的代码是:

myModule.controller('myController',function(xrefService){
    var _this = this;
    _this.data ={};
    _this.getData = function(position){
        myService.getData(position).then(function(response){
            _this.data = response.data
        });
    }
    _this.getData("Manager");
})

测试控制器的代码是:

describe("Test Controller",function(){
   var controller,httpBackend,createController;
   beforeEach(module('myModule'));
   beforeEach(inject(function($controller,$httpBackend){      
      createController = function(){
         return $controller('myController');
      }
      httpBackend = $httpBackend;     
   }));
   it("should return data",function(){
      controller = createController();
      httpBackend.flush();
      expect(controller.data.name).toEqual("Bob");
   });      
})
4

2 回答 2

1

角度文档对 ngMockE2E的$httpbackend 进行了以下说明:

此外,我们不希望像在单元测试期间那样手动刷新模拟请求。出于这个原因,e2e $httpBackend 会自动刷新模拟出的请求,密切模拟 XMLHttpRequest 对象的行为。

所以,简短的回答:它不存在,你也不需要它。

于 2017-02-09T09:19:53.883 回答
0

您在“模块代码”中使用 $httpBackend.whenGET

您应该在测试代码中使用 $httpBackend ,如下所示...

it("should return data",function(){
  $httpBackend.expectGET('/Person?content=Manager').respond(function (){
      var response = {'name':'Bob','age':'43'}
      return [200,response];
  })
  controller = createController();
  httpBackend.flush();
  expect(controller.data.name).toEqual("Bob");
});      

我也建议使用 expectGET 而不是 whenGET。

使用 whenGET 您是在说如果发出请求,然后像这样响应。

用 expectGET 你说......将发出一个请求,当它做出这样的响应时,如果没有发出请求,则测试失败。

PS 如果您在控制器代码中放置了一些 console.log 语句,那么您应该在运行测试套件时看到这些日志语句。如果没有,那么您知道您的控制器代码甚至没有被击中。

也用..

afterEach(function () {
      httpBackend.verifyNoOutstandingExpectation();
      httpBackend.verifyNoOutstandingRequest();
});

如果没有达到预期,这将迫使测试失败。

于 2016-04-05T17:12:18.740 回答