假设我有一个像:
这样的指令.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
,因此测试失败。
答案 0 :(得分:0)
我认为你不能在这种情况下。创建foo和调用foo.bar之间没有时间,你可以抓住它来用间谍替换foo.bar。
当您的spyOn函数运行时,foo.bar()已被调用并返回。
如果foo.bar有像将foo.baz设置为true的副作用,你可以看一下。