1

我有一个 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返回未定义,然后测试失败,因为:

预期的 spy undoAction 未被调用。

知道发生了什么吗????好像spyOn对代码有影响??

4

2 回答 2

2

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

测试该单元的正确方法是将其与其他单元隔离。因为它是被测试的控制器,所以服务应该被模拟或存根:

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

然后在另一个测试中:

spyOn(HistoryService, 'isUndoDisabled').and.returnValue(false);
于 2017-12-18T10:46:01.553 回答
1

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

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

身体里不应该有回报

于 2017-12-18T10:44:17.283 回答