Angular,Jasmine - 在一个函数上进行间谍活动,在$ interval / $ timeout服务中执行

时间:2016-08-30 12:37:47

标签: javascript jasmine karma-jasmine

美好的一天!

我想测试是否调用了parseUrl方法,但结果是:test失败 - 从未调用parseUrl,尽管如果我将parseUrl()放在$ interval服务函数之外,那么测试通过成功。

这是调用parseUrl的地方:

select i.name,i.rooms , group_concat(jsonres separator ',') from  Info_Table i right join ( select r.r_id, CONCAT('[{"NoOfAdults":"', Adult,'","NoOfChild":"', Child,'","ChildAge":[',group_concat(C.Age separator ','),']"}')   jsonres from test.RoomGuests_Table r left join test.ChildAge_Table  c on r.ID=c.R_ID group by c.R_ID)  as r on i.id= r.r_id group by i.name,i.rooms;

以下是测试用例:

    testMethod() {
       let intervalPromise = this._$interval(() => {
         this.parseUrl('test', 'test_code_name');
       }, 500);
    }
    parseUrl(url, name) {}

事实上,如果我将testMethod()放在$ interval服务之外,那么测试成功通过。

1 个答案:

答案 0 :(得分:1)

在测试中,您需要注入$interval服务(可以使用ngMock)并致电$interval.flush(500);

var $interval;

angular.mock.inject(function (myModuleService, _$interval_) {
  // Initialize the service under test instance
  $interval = _$interval_;
});

it('Expect testMethod to be called', function () {
  TestService.testMethod()
  spyOn(TestService, 'parseUrl').and.callThrough();
  $interval.flush(500);
  expect(TestService.parseUrl).toHaveBeenCalled();
});

以下是文档的链接:https://docs.angularjs.org/api/ngMock/service/$interval

  

使用$ interval.flush(millis)向前移动毫秒,并触发计划在该时间内运行的任何函数。