我们如何为嵌套函数编写单元测试用例(Jasmine)?

Posted

技术标签:

【中文标题】我们如何为嵌套函数编写单元测试用例(Jasmine)?【英文标题】:How do we write Unit test cases (Jasmine) for nested functions? 【发布时间】:2017-05-29 02:51:47 【问题描述】:

我正在为以下场景编写一个测试用例。代码覆盖率没有完全覆盖。不知道能不能写。如果我问任何错误的方法,请指导我为这种情况编写一个测试用例,并在将来避免这个问题。至少告诉它可能与否

(function() 
    'use strict';

    angular
        .module('myApp')
        .component("testLockCtrl", 
            templateUrl: 'wwwroot/html/myLocation/testLock.html',
            controller: 'testLockCtrl as vm'
        )
        .controller("testLockCtrl", testLockCtrl);

    testLockCtrl.$inject = ['SessionService', 'HttpRequestSoapAPI'];
    /*Parent Controller*/
    function testLockCtrl($rootScope, $mdDialog) 

         vm.ChangeDataController=ChangeDataController;
        /*childer controller*/
        function ChangeDataController($scope) 
            $scope.tempData = true;
           /*following functions (child of change data controller) can  called in click*/
            $scope.editData = function() 

                $scope.tempData = false;
            


            $scope.editDatas = function() 

                /*some code*/
            

        

        function addData() 
            TC$DialogMgr.tag(function(tagID) 
                $mdDialog.show(
                    locals:  testCase: vm ,
                    controller: ChangeDataController,
                    parent: angular.element(document.body),
                    templateUrl: "wwwroot/html/myLocation/addData.html",
                    clickOutsideToClose: true,
                    preserveScope: true,
                    controllerAs: 'vm'
                ).then(function() 

                , function() 

                ).finally(function() 
                    TC$DialogMgr.unTag(tagID);
                );
            , TC$DialogMgr.type.Input);
        
    

)();

it("Should check if Module Flag status is received", function () 
        var data = [ loc: 'mde', Status: -1 ];
        testLockCtrl.ChangeDataController(data);
        var testData=testLockCtrl.editDatas ()
        expect(testData).toBeDefined();

    )

上面是我的测试用例,它可以覆盖子控制器,而不是它的嵌套函数。我们可以从controller.js文件访问测试用例中的范围变量吗?而且代码覆盖率仅涵盖 ChangeDataController 函数,而不是其内部函数。请帮我写一个测试用例并清除我的疑问。

【问题讨论】:

正如答案所暗示的,每个应该被监视或模拟的函数都应该作为范围(或控制器)方法公开。 嗨,我已经更新了我的代码。你能试试看我做错了什么吗? 您没有公开 addData 作为方法,并且 editDatas 出于某种原因在 ChangeDataController 中设置。完全没有理由在组件中使用 $scope,这是反模式。 【参考方案1】:

答案是您应该公开这些内部函数或间接测试它们。无论在哪里调用 addData 方法,您都可以确保您已经测试过该函数并将不同的参数传递给调用函数。

或者,如果您将addData 添加到$scope,您可以更轻松地进行测试:

$scope.addData = function()  /* ... */ ;

在你的测试中:

var result = controller.addData(...);
expect(result).toBe(expected);

【讨论】:

我试过同样的方法,但我不能。我更新了我的代码,你能看到吗?

以上是关于我们如何为嵌套函数编写单元测试用例(Jasmine)?的主要内容,如果未能解决你的问题,请参考以下文章

如何为combineLatest rxjs Angular编写Jasmine Unit测试用例

如何使用 Jasmine 为以下 javascript 函数编写单元测试用例

AngularJS – 如何在 Jasmine 中为输入事件指令编写单元测试

如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例

如何为 JWT 策略编写单元测试用例

如何为以下代码段编写单元测试用例