如何在单元测试中的请求之间[method]语句时更改$ httpBackend?

时间:2014-08-08 19:30:11

标签: javascript angularjs unit-testing jasmine

在我的测试中,我发起一些模型数据并模拟响应:

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的情况下这样做,那么两者都会失败,通常会出现#34; 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
});

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

我也尝试过:

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

1 个答案:

答案 0 :(得分:2)

resetExpectations()

执行

afterEach($httpBackend.resetExpectations);

文档

  

重置所有请求预期,但保留所有后端定义。通常,当您想要重用$ httpBackend mock的相同实例时,可以在多阶段测试期间调用resetExpectations。

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