Angular - Jasmine:测试立即调用指令控制器

时间:2016-08-11 21:44:58

标签: angularjs testing angularjs-directive jasmine spy

假设我有一个像:

这样的指令
.directive('myDir', function(TemplateHandler){
  return {
    ...
    controller: function(ExploreCmd){
      this.foo = {
        bar: function(){...}
      };

      this.foo.bar();
    }
  }
});

我想测试一下,当加载指令时,调用了this.foo.bar()函数,我该如何实现呢?

我尝试过:

beforeEach(inject(function($compile, $rootScope){
  scope = $rootScope.$new();
  element = angular.element('<js-shell></js-shell>');
  $compile(element)(scope);
  scope.$digest();
  isolatedScope = element.isolateScope().vm;
  spyOn(isolatedScope.foo, 'bar');
}));

it('should register the explore command', () => {
  expect(isolatedScope.foo.bar).toHaveBeenCalled();
});

但问题是在spyOn(isolatedScope.foo, 'bar');被调用后调用isolatedScope.foo.bar,因此测试失败。

1 个答案:

答案 0 :(得分:0)

我认为你不能在这种情况下。创建foo和调用foo.bar之间没有时间,你可以抓住它来用间谍替换foo.bar。

当您的spyOn函数运行时,foo.bar()已被调用并返回。

如果foo.bar有像将foo.baz设置为true的副作用,你可以看一下。