2017-09-26 85 views
0

所以在我的工厂中,我有一个请求HTTP调用并将它们添加到承诺数组的循环。 然后我对结果做了$q.all来构建模型。 当我来测试这个,但我不能让HTTP来做所有的调用,它只做最后一个,我需要它做所有的调用和建立模型。 下面是非常削减代码,(我用7个日期,但想保持的东西短)单元测试多个HTTP请求

工厂代号

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的get URL,我看到所有的URL请求都是一样的,他们似乎没有要更新导致此错误

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

,因为它总是最后httpBackend.expectGET这是采取。

我错过了什么?

回答

0

我的问题是嘲讽。 我把这个放在我的例子之外,因为我认为它不相关并且增加了复杂性,但是为了建立我使用momentJS Library的日期。

所以

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

(以上是在一个循环中)

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

希望这可以帮助别人发现自己挠了几天头,试图弄清楚为什么他们的测试不起作用!