如何在Angular Broadcasting事件之后编写单元测试方法调用

时间:2014-08-27 19:35:42

标签: angularjs unit-testing jasmine

我正在尝试测试我的控制器在触发广播事件时打开模态。 代码工作正常,但期望总是失败:

it('should open model on idleStart', function () {
    $scope.$on('idleStart', function(){
       expect(dsModalSpy).toHaveBeenCalled();
    });
    $scope.$broadcast('idleStart');

 });

我认为它失败是因为它具有广播的异步性质。控制器没有时间打开模态。 所以我在done()方法中添加并将其放在setTimeout函数

it('should open model on idleStart', function (done) {
    $scope.$on('idleStart', function(){
      setTimeout(function(){
        expect(dsModalSpy).toHaveBeenCalled();
        done();
      }, 500);
    });
    $scope.$broadcast('idleStart');

 });

它说它现在正在通过,但我有一个怀疑所以我输入了一个调试器声明。在测试表明已成功通过之后,setTimeout中的代码才会运行。

it('should open modal on idleStart', function (done) {
  $scope.$on('idleStart', function(){
    setTimeout(function(){
      debugger //This code is run after the test says it is completed and passed successfully.
      done();
    }, 500);
  });
  $scope.$broadcast('idleStart');

});

我想通过将do参数添加到it函数中,在调用done函数之前它不会说它已经完成。

谢谢!

1 个答案:

答案 0 :(得分:0)

npm install karma-jasmine给了我1.x版本。

我需要使用Jasmine 2.0

npm install karma-jasmine@2_0 --save-dev