angularjs避免范围。$watch在单元测试期间被触发

angularjs避免范围。$watch在单元测试期间被触发,angularjs,angularjs-scope,jasmine,karma-jasmine,Angularjs,Angularjs Scope,Jasmine,Karma Jasmine,我正在编写angularjs应用程序,在其中一个控制器中,我有一个关于服务方法的watch表达式: $scope.$watch(CodeService.getCode, function(code){ //Some code }); 在我的单元测试中,我模拟代码服务。当我测试控制器的其他部分时,如何防止手表被触发?一种可能的解决方案是使用spyOn进行code服务。getCode始终返回相同的值。这可能看起来像这样: beforeEach(function() { ... spyOn

我正在编写angularjs应用程序,在其中一个控制器中,我有一个关于服务方法的watch表达式:

$scope.$watch(CodeService.getCode, function(code){
 //Some code
});

在我的单元测试中,我模拟代码服务。当我测试控制器的其他部分时,如何防止手表被触发?

一种可能的解决方案是使用
spyOn
进行
code服务。getCode
始终返回相同的值。这可能看起来像这样:

beforeEach(function() {
  ...
  spyOn(CodeService, 'getCode').andReturn(false);
  ...
});

这将触发一次,但此后不应再次触发。

如果没有更多上下文,很难判断最佳方式,但一个简单的方法是模拟
$scope。$watch

var watchSpy = spyOn($scope, '$watch').and.callFake(function(value, callback) {});
您还可以测试它是否被正确调用:

expect(watchSpy).toHaveBeenCalledWith(CodeService.getCode, jasmine.any(Function))
如果您只是想模拟这个特定的手表,您可以存根
getCode
始终返回相同的值:

spyOn(CodeService, 'getCode').andReturn(0);

谢谢你的回复。问题是,即使手表被调用一次,测试也会失败。