Angular Service在间谍时变得未定义



我有一个 Angular 1.6.6 应用程序,我正在使用 Karma 和 Jasmine 进行测试。

给定来自控制器的以下代码:

$scope.undo = function () {
return $scope.isUndoDisabled() || $scope.undoAction();
};
$scope.isUndoDisabled = function () {
return HistoryService.isUndoDisabled();
};

我一直在使用以下规格对其进行测试:

it('undoAction should not be called with default settings', function () {
var $scope = {};
var controller = $controller('PaintController', { $scope: $scope });
spyOn($scope, 'undoAction');
//spyOn(HistoryService, 'isUndoDisabled');
$scope.undo();
expect($scope.undoAction).not.toHaveBeenCalled();
});

并且正在通过测试,但是当我取消注释 HistoryService 的 spyOn 时,来自$scope.isUndoDisabled的调用HistoryService.isUndoDisabled()返回未定义,然后测试失败,因为:

未调用预期的间谍撤消操作。

对正在发生的事情有任何想法吗????似乎spyOn正在影响代码??

spyOn(...)spyOn(...).and.stub()的快捷方式,而不是spyOn(...).and.callThrough()。当以这种方式被监视时,HistoryService.isUndoDisabled()返回undefined.

测试设备的正确方法是将其与其他设备隔离。由于测试的是控制器,因此应模拟或存根服务:

spyOn(HistoryService, 'isUndoDisabled').and.returnValue(true);

然后在另一个测试中:

spyOn(HistoryService, 'isUndoDisabled').and.returnValue(false);

我认为如果你想从HistoryService调用isUndoDisabled(),函数$scope.isUndoDisabled应该是

$scope.isUndoDisabled = function () {
HistoryService.isUndoDisabled();
};

身体不应该有回报

最新更新