单元测试多个HTTP请求

时间:2017-09-26 09:02:23

标签: angularjs unit-testing jasmine mocking httpbackend

所以在我的工厂里,我有一个循环,它请求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

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我的问题是嘲笑。 我把它从我的例子中删除了,因为我认为它不相关并且增加了复杂性,但是为了构建我使用的时刻.JS库。

所以

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]);

认为每次调用它都会让我回复这个模拟,猜测我错了。

正如同事所指出的,我需要做的是使用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]);;

(以上是循环中)

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

希望这可以帮助那些发现自己摸不着头脑的人试图找出他们的测试无效的原因!