在单元测试中,当[method]语句在请求之间时如何改变$httpBackend

How to change $httpBackend when[method] statements between requests in unit testing?

本文关键字:何改变 改变 httpBackend 请求 单元测试 语句 method 之间      更新时间:2023-09-26

在我的测试中,我启动了一些模型数据并模拟响应:

beforeEach(function(){
   var re = new RegExp(/^http':'/'/.+?'/users-online'/(.+)$/);
   $httpBackend.whenGET(re).respond({id:12345, usersOnline:5000});
});      
it('should find 5000 users in channel 12345', function(){
    expect( UsersOnlineService.data.usersOnline).toEqual( 50000);
});

然后在下一个测试语句中说,我想要通道的更新值。每个人都离开了,假设这会触发其他行为,所以我需要模拟第二个请求,这样我就可以测试那个行为。

$httpBackend.whenGET添加到下一条it语句中,不会覆盖beforeEach的值。它似乎使用了原始的模拟值:

it('should find 0 users in channel 12345', function(){
    $httpBackend.whenGET(re).respond({id:12345, usersOnline:0});
    expect( UsersOnlineService.data.usersOnline).toEqual( 50000); //fails
});

如果我这样做而不使用beforeEach,两者都会失败,并出现通常的"unexpectedGet"错误。

it('should find 5000 users in channel 12345', function(){
     var re = new RegExp(/^http':'/'/.+?'/users-online'/(.+)$/);
     $httpBackend.whenGET(re).respond({id:12345, usersOnline:5000});
    expect( UsersOnlineService.data.usersOnline).toEqual( 50000); //fails
});
it('should find 0 users in channel 12345', function(){
      var re = new RegExp(/^http':'/'/.+?'/users-online'/(.+)$/);
     $httpBackend.whenGET(re).respond({id:12345, usersOnline:0});
    expect( UsersOnlineService.data.usersOnline).toEqual( 0); //fails
});

如何在请求之间调制模拟数据?

我也试过:

  • it语句之间夹beforeEach
  • 设置.respond(fakeResponse变量。然后在每个it语句中修改fakeResponse的值。

resetExpectations()

执行

afterEach($httpBackend.resetExpectations);

文档

重置所有请求期望,但保留所有后端定义。通常,当您希望重用相同的$httpBackend mock实例时,您将在多阶段测试中调用resetExpectations。

文档来源:https://docs.angularjs.org/api/ngMock/service/$httpBackend