Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 无法对ngMockE2E使用httpBackend刷新_Angularjs_Karma Jasmine_Httpbackend_Ngmocke2e - Fatal编程技术网

Angularjs 无法对ngMockE2E使用httpBackend刷新

Angularjs 无法对ngMockE2E使用httpBackend刷新,angularjs,karma-jasmine,httpbackend,ngmocke2e,Angularjs,Karma Jasmine,Httpbackend,Ngmocke2e,我试图用jasmine测试我的控制器。基本上,当控制器被创建时,它将调用一个服务来发出http请求。我正在使用httpBackend获取假数据。当我试着运行测试时,我总是得到一个错误:没有待处理的刷新请求。如果删除httpBackend.flush,则测试失败,因为controller.data.name未定义。有人知道为什么会这样吗?谢谢 模块的代码如下所示: var myModule = angular.module('myModule', ['ngMockE2E']); myModule.

我试图用jasmine测试我的控制器。基本上,当控制器被创建时,它将调用一个服务来发出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");
   });      
})

您正在模块代码中使用$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

当你说如果有人提出请求,那么就这样回答

你是说。。。将发出请求,当请求做出这样的响应时,如果未发出请求,则测试失败

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

也使用

afterEach(function () {
      httpBackend.verifyNoOutstandingExpectation();
      httpBackend.verifyNoOutstandingRequest();
});
如果未达到预期,这将导致测试失败。

关于ngMockE2E的$httpbackend,如下所述:

此外,我们不想手动刷新模拟 像我们在单元测试期间所做的请求。因此,e2e $httpBackend自动、紧密地刷新模拟请求 模拟XMLHttpRequest对象的行为


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

谢谢你,现在就可以了。然而,我想知道我们是否可以避免在测试方法中使用expectGET.Response。因为这意味着我需要读取服务代码来测试控制器。例如,我可能只是想测试controller.data是否为空,这意味着它从后端接收一些数据。现在你的想法是:是的,你想使用Jasmine spy。spyOnmyService,'getData'。and.callFakefunction{var def=$q.defer;def.resolveYOUR_MOCK_HTTP_RESPONSE;return def.promise;};expectmyService.getData.To已被调用;代码是说。。。当调用myService.getData时,使用假响应进行响应。伪响应返回一个承诺,就像您的真实方法返回一个承诺一样。然后你可以监视你的服务函数,查看它被调用了多少次,调用它的参数是什么,等等。你可以继续检查controller.data no probs中的值-现在将由你在fak响应中提供的假数据填充。上帝保佑:忘了提一下,你真正的HTTP现在不会被调用了,所以你不需要再去expectGET了。谢谢danday74,它真的很有帮助D