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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了间谍服务在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,然后测试失败,因为:

预期的间谍undoAction没有被调用。

关于发生了什么的任何想法????似乎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();
};

身体不应该有回归

以上是关于间谍服务在spyOn时变为未定义的主要内容,如果未能解决你的问题,请参考以下文章

创建间谍时,Jasmine找不到功能

如何在 Jest 中重置或清除间谍?

Jasmine spyOn 函数和返回对象

来自 node_modules 的 Angular 单元测试 spyOn 类

如何为 Jasmine 间谍的多个调用提供不同的返回值

当尝试将变量传递给另一个模块时,将代码拆分到Nodejs中的自定义模块时,它将被定义为未定义