我正在使用BootstrapDialog来显示一个对话框。如果用户单击“删除”,则会调用我的服务并将其从数据库中删除。如果他们单击取消它将关闭对话框。
我正在编写单元测试,这个让我很困惑。对我的服务的调用是非常深的嵌套,我甚至不知道如何使测试知道我正在测试哪条路径。
我在控制器中的代码:
$scope.deleteInventoryEntry = function(id){
//launch dialog
BootstrapDialog.show({
title: 'CONFIRM DELETION',
message: 'Are you sure you want to delete this record?',
closable: false,
type: BootstrapDialog.TYPE_DANGER,
buttons: [{
label: 'Cancel',
action: function(dialog) {
dialog.close();
}
}, {
label: 'Delete',
icon: 'glyphicon glyphicon-remove',
cssClass: 'btn-danger',
action: function(dialog) {
//remove item from database
tankService.deleteInventoryEntry(id).success(function (response) {
//remove item from table if successful
if(response > 0){
//figure out which item to remove from table
var pos = $scope.invTable.filtered.map(function(item) { return item._id; }).indexOf(id);
//remove from table
$scope.invTable.filtered.splice(pos,1);
$scope.selectedItem.lineItems = [];
dialog.close();
//$scope.successGrowl(' QC Deleted Successfully');
}
});
}
}
]
});
};
我的测试
it('prompts on delete inventory item', function(){
spyOn(BootstrapDialog, 'show').and.callThrough();
$scope.deleteInventoryEntry(1);
expect(BootstrapDialog.show).toHaveBeenCalled();
});
我还可以测试ID是否为NAN或Null并且对话框不应该显示。但我只是好奇我是否应该以某种方式测试tankService.deleteInventoryEntry()被调用。我觉得我应该但这是否意味着我必须模拟整个对话框项目?
非常感谢任何帮助我指明正确方向的帮助。
谢谢!
答案 0 :(得分:1)
任何测试的经验法则。不要测试实现,而是测试行为。例如,您应该测试当您填写表单并单击提交按钮时,它会被发送到您的API并且响应中发生了一些事情。测试应尽可能独立于视图部分(例如,表单位于模态或页面中的某个位置)。