![](/img/trans.png)
[英]Jasmine test case error: spy error to have been called
[英]Jasmine test case error 'Spy 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);
});
});
};
我的茉莉花測試案例
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();
});
並獲得以下錯誤“已預期的間諜[對象對象]已被調用。錯誤:已調用預期的間諜[對象]。”
在我的測試用例中有什么問題?我錯過了什么嗎?
提前致謝!!!
編輯:更改我的Jasmine測試用例如下所示獲取不同的消息''undefined'不是一個函數(評估'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()
的助手是創建一個“裸”間諜,它可以作為回調傳遞,以確保它被調用( docs )。 jasmine.createSpy()
只應用一個參數,該參數是要在測試結果中顯示的間諜的名稱,這就是為什么沒有任何間諜附加到您的對象。
更新:
您在第一個代碼段中有一行:
ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });
正如你所看到的, showDialog()
之后是then()
。 我假設原始showDialog()
返回一個帶有方法then()
對象,也許它是一個Promise。 但是在你的窺探showDialog()
方法的測試中,來自callFake()
你沒有用then()
方法返回任何東西,因此錯誤表明方法是未定義的。 間諜完全取代了原始方法,並與callFake()
一起重新創建了原始行為。
所以從callFake()
你應該返回一個模仿Promise的東西,例如:
spyOn(ModalDialogFactory, 'showDialog').and.callFake(function() {
// ....
return {
then: function (cb) {
cb($scope.tags);
}
};
});
這里我返回一個具有then()
方法的對象,當用函數作為參數調用它時,這個函數就像一個回調一樣,用$scope.tags
值解析,可以在這個回調中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.