Jasmine 测试用例错误 'Spy to have been called'
Jasmine test case error 'Spy to have been called'
我正在为以下 angular 函数编写 jasmine 测试用例并收到测试用例失败消息 "Expected spy [object Object] to have been called"。
$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);
});
});
};
我的 Jasmine 测试用例
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();
});
并出现以下错误
“预期间谍 [object Object] 已被调用。
错误:预期间谍 [object Object] 已被调用。"
我的测试用例有什么问题?我遗漏了什么吗?
提前致谢!!!
已编辑:
更改了我的 Jasmine 测试用例,如下所示,得到不同的消息 ''undefined' is not a function (evaluating 'ModalDialogFactory.showDialog(dialogOptions).then')'
已尝试是否定义了 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();
});
如果你想监视现有对象的方法,你应该使用 spyOn
helper (docs):
spyOn(modalDialogFactory, 'showDialog').and.callFake(...);
作为第一个参数,它应用一个对象,作为第二个 - 方法的名称。它用间谍对象替换现有对象的方法。
要检查是否调用了间谍,您应该将其传递给 expect()
:
expect(modalDialogFactory.showDialog).toHaveBeenCalled();
您使用 jasmine.createSpy()
的助手是创建一个 "bare" 间谍,它可以作为回调传递以确保它被调用 (docs)。 jasmine.createSpy()
只应用一个参数,即要在测试结果中显示的间谍名称,这就是为什么没有任何间谍附加到您的对象。
更新:
您在第一个片段中有一行:
ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });
如您所见,showDialog()
后面跟着 then()
。我假设原始 showDialog()
return 是一些带有方法 then()
的对象,也许它是一个 Promise。但是在你的测试中,当你监视 showDialog()
方法时,从 callFake()
你没有 return 使用 then()
方法的任何东西,因此错误指出方法未定义。 Spy 完全替换了您的原始方法,并与 callFake()
结合使用,它重新创建了原始行为。
所以从 callFake()
你应该 return 模仿 Promise 的东西,例如:
spyOn(ModalDialogFactory, 'showDialog').and.callFake(function() {
// ....
return {
then: function (cb) {
cb($scope.tags);
}
};
});
这里我 return 一个有 then()
方法的对象,当它以一个函数作为参数调用时,这个函数就像一个回调函数一样被解析为 $scope.tags
值,可以在此回调中使用。
我正在为以下 angular 函数编写 jasmine 测试用例并收到测试用例失败消息 "Expected spy [object Object] to have been called"。
$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);
});
});
};
我的 Jasmine 测试用例
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();
});
并出现以下错误 “预期间谍 [object Object] 已被调用。 错误:预期间谍 [object Object] 已被调用。"
我的测试用例有什么问题?我遗漏了什么吗?
提前致谢!!!
已编辑: 更改了我的 Jasmine 测试用例,如下所示,得到不同的消息 ''undefined' is not a function (evaluating 'ModalDialogFactory.showDialog(dialogOptions).then')'
已尝试是否定义了 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();
});
如果你想监视现有对象的方法,你应该使用 spyOn
helper (docs):
spyOn(modalDialogFactory, 'showDialog').and.callFake(...);
作为第一个参数,它应用一个对象,作为第二个 - 方法的名称。它用间谍对象替换现有对象的方法。
要检查是否调用了间谍,您应该将其传递给 expect()
:
expect(modalDialogFactory.showDialog).toHaveBeenCalled();
您使用 jasmine.createSpy()
的助手是创建一个 "bare" 间谍,它可以作为回调传递以确保它被调用 (docs)。 jasmine.createSpy()
只应用一个参数,即要在测试结果中显示的间谍名称,这就是为什么没有任何间谍附加到您的对象。
更新:
您在第一个片段中有一行:
ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });
如您所见,showDialog()
后面跟着 then()
。我假设原始 showDialog()
return 是一些带有方法 then()
的对象,也许它是一个 Promise。但是在你的测试中,当你监视 showDialog()
方法时,从 callFake()
你没有 return 使用 then()
方法的任何东西,因此错误指出方法未定义。 Spy 完全替换了您的原始方法,并与 callFake()
结合使用,它重新创建了原始行为。
所以从 callFake()
你应该 return 模仿 Promise 的东西,例如:
spyOn(ModalDialogFactory, 'showDialog').and.callFake(function() {
// ....
return {
then: function (cb) {
cb($scope.tags);
}
};
});
这里我 return 一个有 then()
方法的对象,当它以一个函数作为参数调用时,这个函数就像一个回调函数一样被解析为 $scope.tags
值,可以在此回调中使用。