【问题标题】:AngularJS - interval doesn't get flushedAngularJS - 间隔不会被刷新
【发布时间】:2014-09-09 17:37:56
【问题描述】:

我有我愿意测试的角度服务功能:

doSomeTask: function (ids, callback) {
  $http.put('/get_job', {'ids': ids}).success(function (data) {
    var statusCheck = $interval(function() {
      $http.get('check_status?=' + data.job_id).success(function (data) {
        if(data.completed) {
          $interval.cancel(statusCheck);
          // and do something...
        }
      });
    }, 2000);
  });

并对其进行以下测试:

describe('MyService', function() {

  var myService;
  var $httpBackend;
  var $interval;

  beforeEach(module('myModule'));

  beforeEach(inject(function(_$httpBackend_, _$interval_, $rootScope, MyService) {
    $httpBackend = _$httpBackend_;
    $interval = _$interval_;
    myService  = MyService;
  }));

  describe('doSomeTask', function () {
    beforeEach(function () {
      $httpBackend.expectPUT("/get_job").respond({ job_id: '123' });
      $httpBackend.expectGET("/status_check").respond({ completed: true });
    });

    it('should do it well', inject(function ($interval) {    
      var ids = [1,2,3];
      myService.doSomeTask(ids);

      $httpBackend.flush();
      $interval.flush();
    }));
  });
});  

似乎我的区间永远不会被刷新(第二个期望永远不会得到满足,并且我在区间体内的断点从未被触发)。似乎我正在使用模拟(在刷新实现中提出了一些建议)。 Angular 和 mocks 的版本是一样的……

我做错了什么?如何刷新我的间隔?

【问题讨论】:

    标签: javascript angularjs angular-mock


    【解决方案1】:

    我认为您必须在刷新间隔后再次调用 $httpBackend.flush()。测试在代码的这个地方做日志时是否得到控制台输出:

    doSomeTask: function (ids, callback) {
      $http.put('/get_job', {'ids': ids}).success(function (data) {
        var statusCheck = $interval(function() {
          console.log("flushed");
          $http.get('check_status?=' + data.job_id).success(function (data) {
            if(data.completed) {
              $interval.cancel(statusCheck);
              // and do something...
            }
          });
        }, 2000);
      });
    

    当您在控制台中获得 flushed 时,再调用第二个 $httpBackend.flush() 并触发第二个 http 请求。

    it('should do it well', inject(function ($interval) {    
      var ids = [1,2,3];
      myService.doSomeTask(ids);
    
      $httpBackend.flush();
      $interval.flush();
      // after this call, you should get a 'flushed' in your console
      $httpBackend.flush();
      // after this call, the second http should fire
    }));
    

    解决方案:

    要刷新间隔,请指定要刷新的毫秒数,如下所示:$interval.flush(2000)

    【讨论】:

    • 试过了。这正是我期望看到的,“脸红”。但它只是没有发生。因此,如果我再次刷新 $httpBackend,我会收到“无待处理请求”错误...
    • 那么,您在控制台中看到console.log("flushed"); 的输出了吗?
    • 我想我想通了...刷新必须指定毫秒数。当我这样做的时候,它脸红了,所有的美好时光!
    • 我已经更新了我的答案,以便未来的读者无需阅读 cmets 即可获得快速解决方案。
    • 这太棒了。不知道为什么 $interval 要求您输入实际的毫秒数,而 $timeout 则不需要。也许只有我一个人,但在这方面的文档中没有找到任何东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多