在init()函数中调用$ timeout时的单元测试控制器

时间:2015-06-04 21:08:06

标签: javascript angularjs unit-testing jasmine chutzpah

我正在尝试使用chutzpah / test explorer在视觉工作室中进行茉莉花测试。

我有一个看起来像这样的控制器:

#include<stdio.h>
int main()
{
    char c = 125;
    c = c+10;
    printf("%d", c);
    return 0;
}

我的测试文件如下所示:

function ctrl($scope, $timeout, resolvedData) {
  var vm = this;
  vm.data;
  init();

  function init() {
    if(resolvedData.length > 0) {
      $timeout(function() {
        vm.data = resolvedData;
      }, 0);
    };
  };
}

当我添加$ timeout.flush()时,我收到此错误:

  

错误:[$ rootScope:infdig] 10 $ digest()迭代达成。中止!

取出$ timeout.flush()会给我这个错误:

  

预期未定义为[{},{},{}]。

在expect之前添加$ scope。$ apply()(而不是$ timeout.flush())给我这个:

  

错误:[$ rootScope:infdig] 10 $ digest()迭代达成。中止!

我还缺少其他东西吗?我想测试在调用$ timeout函数后控制器加载时vm.data被设置但没有运气。

编辑1: 我创造了一个plunker,它的工作正常。我很难过。 http://plnkr.co/edit/Ae28AyjKwCTen1nHKZAo?p=preview

编辑2: 我用$ timeout.verifyNoPendingTasks()替换$ timeout.flush(),如下所示:

describe('ctrl', function() {
  var ctrl,
      resolvedData,
      $controller,
      $timeout,
      $scope;
  var mockResolvedData = [{}, {}, {}];

  beforeEach(function() {
    module('app');
    inject(function(_$controller_, _$rootScope_, _$timeout_) {
      $scope = _$rootScope.$new();
      $controller = _$controller_;
      $timeout = _$timeout_;
      resolvedData = mockResolvedData;
      ctrl = $controller('ctrl', {$scope: $scope, resolvedData: resolvedData, $timeout: $timeout})
    })
  })

  it('should set data when the controller loads', function() {
    $timeout.flush();
    expect(ctrl.data).toEqual(mockResolvedData);
  })
})

现在我有这个错误:

  

错误:要延迟的任务要刷新(2):{id:0,时间:0},{id:1,时间:0}

因此我们可以清楚地看到有任务要刷新,但是当我刷新它们时,我得到了摘要错误。

1 个答案:

答案 0 :(得分:0)

当使用回调函数调用$ timeout时,发生了这种情况。省略此功能时,确实有效。对于你的控制器,这意味着:

$timeout(vm.data = resolvedData, 0);

我知道这是一个不太受欢迎的解决方案,但它适用于控制器和测试。