1

我正在使用 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() 是否被调用。我觉得我应该这样做,但这是否意味着我必须模拟整个对话项目?

任何帮助我指出正确方向的帮助将不胜感激。

谢谢!

4

1 回答 1

1

任何测试的经验法则。不要测试实现,而是测试行为。例如,您应该测试,当您填写表单并单击提交按钮时,它会发送到您的 API 并发生响应。测试应该尽可能独立于视图部分(例如,表单是位于模式中还是页面中的某个位置)。

于 2016-09-23T21:21:36.193 回答