Javascript Jasmine测试用例错误';间谍被称为';

Javascript Jasmine测试用例错误';间谍被称为';,javascript,angularjs,jasmine,karma-jasmine,Javascript,Angularjs,Jasmine,Karma Jasmine,我正在为下面的角函数编写jasmine测试用例,并得到测试用例失败消息“预期spy[object]已被调用” 我的茉莉花测试用例 it('should call displayTagModelPopup', function() { var dialogOptions = { templateUrl: 'views/mytags.html', controller: 'TagsCtrl', size: 'lg', tagsA

我正在为下面的角函数编写jasmine测试用例,并得到测试用例失败消息“预期spy[object]已被调用”

我的茉莉花测试用例

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();

});
得到下面的错误 “预期已调用spy[object]。 错误:预期已调用spy[object]

我的测试用例中有什么问题?我遗漏了什么吗

提前感谢

编辑: 更改了我的Jasmine测试用例,如下所示:获取不同的消息“未定义”不是函数(评估“ModalDialogFactory.showDialog(dialogOptions).then”)

已尝试是否定义ModelDialogFactory,但已成功定义ModalDialogFactory.showDialog方法。 仅当调用方法“$scope.displayTagModelPopup();”时,获取测试用例失败


如果要监视现有对象的方法,应使用
spyOn
helper():

作为第一个参数,它应用一个对象,作为方法的第二个名称。它用间谍对象替换现有对象的方法

要检查是否调用了spy,应将其传递给
expect()

您使用的帮助程序jasmine.createSpy()是创建一个“裸”间谍,它可以作为回调传递,以确保调用它()
jasmine.createSpy()
只应用一个参数,即测试结果中要显示的间谍的名称,这就是为什么没有任何间谍附加到您的对象上


更新:

第一个代码段中有一行:

ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });
如您所见,
showDialog()
后面跟着
then()
。我假设原始的
showDialog()
返回了一个带有方法
then()
的对象,也许这是一个承诺。但是在您的测试中,当您监视
showDialog()
方法时,从
callFake()
中,您不会返回带有
then()
方法的任何内容,因此错误表明方法未定义。Spy完全取代了您原来的方法,并与
callFake()
一起重新创建了原始行为

因此,从
callFake()
中,您应该返回模仿承诺的内容,例如:

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

在这里,我返回一个对象,该对象具有
then()
方法,当使用函数作为参数调用它时,该函数就像回调函数一样,使用
$scope.tags
值解析,该值可以在回调函数中使用

谢谢你,迈克尔!更改了我的测试用例,但运气不好。我不确定,但我怀疑我的$scope.displayTagModelPopup()方法没有与ModalDialogFactory.showDialog关联。如果你有时间,请看我编辑的部分。
spyOn(modalDialogFactory, 'showDialog').and.callFake(...);
expect(modalDialogFactory.showDialog).toHaveBeenCalled();
ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });
spyOn(ModalDialogFactory, 'showDialog').and.callFake(function() {
    // ....
    return {
        then: function (cb) {
             cb($scope.tags);
        }
    };
});