【问题标题】:Unit Test Multiple HTTP Requests单元测试多个 HTTP 请求
【发布时间】:2017-09-26 09:02:23
【问题描述】:

所以在我的工厂里,我有一个循环,它请求 HTTP 调用并将它们添加到一个 Promise 数组中。 然后我对结果执行$q.all 以构建模型。 当我来测试它时,我无法让 HTTP 进行所有调用,它只进行最后一个调用,我需要它来进行所有调用并构建模型。 下面是非常精简的代码,(我使用 7 个日期,但想保持简短)

工厂代码

function getLatestData(){
    var dateArray= ['2017-09-21','2017-09-22']
   for (i = 0; i < 2; i++) {
       var url = 'data-server/date/[i]'                                            
       promises.push(getData(url)); // getData is a simple $http function call.
   }
  return $q.all(promises).then(function(response){
    buildModel(reponse);
    });
}

所以当我来测试这个时,我得到了类似的东西(我确实尝试了一个循环,但失败了)。

 httpBackend.expectGET('data-server/date/2017-09-21' ).respond(mockData[0]);
 httpBackend.expectGET('data-server/date/2017-09-22' ).respond(mockData[1]);
 rootScope.$apply();
  modelFactory.getLatestData().then(function(response){
           expect(response).toEqual(mockModelData);
  })

所以我 console.log 获取 URL 并且我看到所有 URL 请求都是相同的,它们似乎没有更新导致此错误

Error: Unexpected request: GET 'data-server/date/2017-09-22'
Expected GET 'data-server/date/2017-09-21' 

因为它总是最后一个 httpBackend.expectGET 被占用。

我错过了什么?

【问题讨论】:

    标签: angularjs unit-testing jasmine mocking httpbackend


    【解决方案1】:

    我的问题是嘲笑。 我在示例中省略了这个,因为我认为它不相关并且增加了复杂性,但是为了构建日期,我使用了 momentJS 库。

    所以

    var url = 'data-server/date/[i]'   
    

    var url = 'data-server/date/'+factory.getMoment().add(i,'d').format('YYYY-MM-DD');
    

    factory.getMoment 只是暂时的包装,我的想法是我可以在单元测试中覆盖它,为我提供一个“给定的”日期对象。

    funciton getMoment(){
        return moment();
    }
    

    无论如何,在我的测试中,我有这个

    var mockDate = moment('2017-09-21');
    spyOn(factory, 'getMoment').and.returnValue(moment('2017-09-21'));
    
    httpBackend.expectGET('data-server/date/'+mockDate.format('YYYY-MM-DD').respond(mockData[0]);
    httpBackend.expectGET('data-server/date/'+mockDate.add(1,'d').format('YYYY-MM-DD').respond(mockData[1]);
    

    认为每次调用 this 时,它都会返回这个 mock,我猜我错了。

    正如一位同事指出的那样,我需要做的是使用jasmine's clock mock

    beforeEach(function () {
        jasmine.clock().install();
    })
    afterEach(function () {
        jasmine.clock().uninstall();
    })
    

    然后在我的测试中我设置了日期时间

    mockDate = moment('2017-09-21'); // always use moment as JS date if badly broken and just can't be trusted!
    jasmine.clock().mockDate(mockDate.toDate());
    
     httpBackend.expectGET('data-server/date/'+moment().add(0, 'days').format("YYYY-MM-DD").respond(mockData[0]);;
     httpBackend.expectGET('data-server/date/'+moment().add(1, 'days').format("YYYY-MM-DD").respond(mockData[1]);;
    

    (上面是循环的)

    我已经删除了我的间谍,现在我的日期和请求按预期工作了。

    希望这可以帮助那些发现自己数天来摸不着头脑想弄清楚为什么他们的测试不起作用的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2020-03-06
      • 2018-03-13
      • 2015-07-30
      • 1970-01-01
      • 2017-11-23
      • 2023-03-20
      相关资源
      最近更新 更多