间谍服务在spyOn时变为未定义

时间:2017-12-18 10:10:11

标签: javascript angularjs jasmine karma-jasmine spyon

我有一个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时,来自HistoryService.isUndoDisabled()的调用$scope.isUndoDisabled将返回undefined,然后测试将失败因为:

  

预期的间谍撤消行动尚未被调用。

有关进展情况的任何想法????似乎spyOn正在影响代码??

2 个答案:

答案 0 :(得分:2)

spyOn(...)spyOn(...).and.stub()的快捷方式,而不是spyOn(...).and.callThrough()。当以这种方式进行间谍活动时,HistoryService.isUndoDisabled()会返回undefined

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

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

然后在另一个测试中:

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

答案 1 :(得分:1)

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

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

不应该是身体的回归