茉莉花测试用例错误“间谍已经被称为”(Jasmine test case error 'Sp

2019-10-24 04:55发布

我正在写茉莉测试用例以下角度函数获得测试案例失败的消息“预期间谍[目标对象]已被称为”。

    $scope.displayTagModelPopup = function() {
        var dialogOptions = {
            templateUrl: 'views/mytags.html',
            controller: 'TagsCtrl',
            size: 'lg',
            resolve: {
                tagsAvailable: function() {
                    return $scope.availableTags;
                }
            }
        };

        ModalDialogFactory.showDialog(dialogOptions).then(function(result) {
            $scope.selectedFields = [];
            $scope.selectedFieldIds = [];

            angular.forEach(result, function(tag) {
                $scope.selectedFields.push(tag);
                $scope.selectedFieldIds.push(tag.objectId);
            });
        });
    };

我的茉莉花测试用例

it('should call displayTagModelPopup', function() {
    var dialogOptions = {
        templateUrl: 'views/mytags.html',
        controller: 'TagsCtrl',
        size: 'lg',
        tagsAvailable: [{
            objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0",
            dataFieldName: "author",
            shortNamePath: "$.author",
            templates: ["HaM sheet"]
        }]
    };
    var spy = jasmine.createSpy(modalDialogFactory, 'showDialog').and.callFake(function(data) {
        $scope.tags = [{
            objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0",
            dataFieldName: "author",
            shortNamePath: "$.author",
            templates: ["HaM sheet"]
        }];
        return $scope.tags;
    });

    $scope.displayTagModelPopup();
    $scope.$digest();
    expect(spy).toHaveBeenCalled();

});

并且提示以下错误:“预期间谍[目标对象]已被称为错误:预期间谍[目标对象]已被称为”。

是什么在我的测试案例的问题?我失去了什么?

提前致谢!!!

编辑:改变了我的茉莉花测试用例像下面让不同的消息“”未定义“不是(评估‘ModalDialogFactory.showDialog(dialogOptions)。然后’)”功能

尝试是否ModelDialogFactory被定义或没有,但ModalDialogFactory.showDialog方法成功定义。 获得测试情况下,只有调用该方法时失败“$ scope.displayTagModelPopup();”

it('should call displayTagModelPopup', function() {

    spyOn(ModalDialogFactory, 'showDialog').and.callFake(function() {
        $scope.tags = [{
            objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0",
            dataFieldName: "author",
            shortNamePath: "$.author",
            templates: ["HaM sheet"]
        }];
        return $scope.tags;
    });
    var dialogOptions = {
        templateUrl: 'views/mytags.html',
        controller: 'TagsCtrl',
        size: 'lg',
        tagsAvailable: [{
            objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0",
            dataFieldName: "author",
            shortNamePath: "$.author",
            templates: ["HaM sheet"]
        }]
    };
    //expect(ModalDialogFactory).toBeDefined();
    //expect(ModalDialogFactory.showDialog).toBeDefined();

    $scope.displayTagModelPopup();
    $scope.$digest();

});

Answer 1:

如果你想刺探现有的,你应该使用对象的方法spyOn助手( 文档 ):

spyOn(modalDialogFactory, 'showDialog').and.callFake(...);

作为第一个参数适用的对象,并且作为第二个 - 名称的方法的。 它取代现有的对象与间谍对象的方法。

要检查是否间谍被称为你应该把它传递给expect()

expect(modalDialogFactory.showDialog).toHaveBeenCalled();

您使用的辅助jasmine.createSpy()是创建一个“裸”的间谍,它可以作为回调传递,以确保它会被称为( 文档 )。 jasmine.createSpy()只适用于一个参数,即在测试结果中显示的间谍的名字,这是为什么没有连接到您的对象中的任何间谍。


更新:

你必须在第一个片段的一行:

ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });

正如你所看到showDialog()之后then() 我认为原来showDialog()返回一个方法的一些对象then()也许这是一个承诺。 但是,当你窥视一个测试showDialog()方法,从callFake()你不返回任何then()方法,因此错误提示的方法是不确定的。 间谍完全取代原来的方法,并会同callFake()它重新创建原始行为。

所以从callFake()你应该返回的东西,模仿承诺,例如:

spyOn(ModalDialogFactory, 'showDialog').and.callFake(function() {
    // ....
    return {
        then: function (cb) {
             cb($scope.tags);
        }
    };
});

在这里,我回到它有一个对象then()方法,而当它被称为一个函数作为参数,然后像个回调此功能与解决$scope.tags值,这可能回调内部使用。



文章来源: Jasmine test case error 'Spy to have been called'