Как мы пишем модульные тесты (Jasmine) для вложенных функций?

Я пишу тестовый пример для следующего сценария. Покрытие кода не полностью покрыто. Не знаю, можно ли писать или нет. Если я спрошу что-то не так, значит, любезно посоветуйте мне написать тестовый пример для этого сценария и избежать этой проблемы в будущем. По крайней мере, скажите, возможно это или нет.

(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, а не ее внутренние побочные функции. Пожалуйста, помогите мне написать тестовый пример и развеять мои сомнения.


person Sathish    schedule 13.01.2017    source источник
comment
Как следует из ответа, каждая функция, которую следует отслеживать или высмеивать, должна быть представлена ​​как метод области (или контроллера).   -  person Estus Flask    schedule 13.01.2017
comment
Привет, я обновил свой код. Можете ли вы попытаться выяснить, что я сделал неправильно?   -  person Sathish    schedule 14.01.2017
comment
Вы не предоставили addData как метод, а editDatas по какой-то причине установлен в ChangeDataController. Нет никакой причины использовать такую ​​$ scope в компоненте, это антипаттерн.   -  person Estus Flask    schedule 14.01.2017


Ответы (1)


Ответ заключается в том, что вам следует раскрыть эти внутренние функции или протестировать их косвенно. Везде, где вызывается метод addData, вы можете просто убедиться, что вы протестировали эту функцию и передать другие параметры вызывающей функции.

Или, если вы добавите addData к $scope, вам будет проще протестировать:

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

В вашем тесте:

var result = controller.addData(...);
expect(result).toBe(expected);
person Community    schedule 13.01.2017
comment
Я пробовал это так же, но не могу. Я обновил свой код, вы можете его увидеть? - person Sathish; 14.01.2017