Uji unit pengontrol direktif sudut menggunakan window.confirm

Saya mencoba mendapatkan cakupan tes 100% untuk sebuah arahan. Direktif memiliki pengontrol dengan fungsi yang menggunakan metode window.confirm.

'use strict';

(function() {

    angular
        .module('app')
        .directive('buttonToggle', buttonToggle);

    function buttonToggle() {
        var buttonToggleController = ['$scope', function($scope) {
            $scope.toggle = function() {
                var confirmResponse = (window.confirm('Are you sure?') === true);

                if(confirmResponse) {
                    $scope.on = !$scope.on;
                }
                return $scope.on;
            };
        }];

        return {
            restrict: 'E',
            templateUrl: 'client/modules/buttonToggle/buttonToggle.html',
            replace: true,
            scope: {
                on: '='
            },
            controller: buttonToggleController
        };
    }
})();

Saya telah menguji untuk memastikan semuanya sudah ditentukan, tetapi saya tidak dapat memasukkan pernyataan if dalam metode $scope.toggle pengontrol.

describe('The buttonToggle directive', function() {

    var $compile,
        $scope,
        btElement = '<button-toggle></button-toggle>',
        compiledElement,
        window,
        confirm,
        btElementPath = 'client/modules/buttonToggle/buttonToggle.html',
        btController;

    beforeEach(module('app'));
    beforeEach(module(btElementPath));

    beforeEach(inject(function(_$compile_, _$rootScope_, $templateCache, $window) {
        $compile = _$compile_;
        window = $window;
        spyOn(window, 'confirm');
        $scope = _$rootScope_.$new();
        var template = $templateCache.get(btElementPath);
        $templateCache.put(btElementPath, template);
        var element = angular.element(btElement);
        compiledElement = $compile(element)($scope);
        $scope.$digest();
        btController = element.controller('buttonToggle', {
            $window: window
        });
        scope = element.isolateScope() || element.scope();
    }));

    it('should be defined', function() {
        expect(compiledElement.html()).toContain('btn');
    });

    describe('buttonToggle controller', function() {
        it('should be defined', function() {
            expect(btController).not.toBeNull();
            expect(btController).toBeDefined();
        });

        describe('toggle', function() {
            it('should be defined', function() {
                expect(scope.toggle).toBeDefined();
            });

            it('should confirm the confirmation dialog', function() {
                scope.toggle();
                expect(window.confirm).toHaveBeenCalled();
            });
        });
    });
});

Saya kira ini ada hubungannya dengan mengejek layanan $window, tapi saya tidak yakin apakah saya bisa mengujinya karena tidak dideklarasikan secara global. Jadi, apakah fungsi pengontrol sepenuhnya "dapat diuji unit"? Jika tidak, haruskah saya menulis pengontrol direktif dalam file terpisah dan menggunakan angular.module.controller? Jika ya, lalu bagaimana saya bisa mengujinya, atau apa yang saya lewatkan?


person Healforgreen    schedule 25.01.2016    source sumber
comment
Anda sadar bahwa confirm sama seperti alert memblokir eksekusi skrip?   -  person charlietfl    schedule 26.01.2016
comment
Itu memblokirnya, lalu setelah Anda klik ya atau tidak, eksekusi skrip berlanjut kan?   -  person Healforgreen    schedule 26.01.2016
comment
ya ... begitulah cara menggunakannya dalam kondisi ... mengembalikan boolen ketika pengguna mengkliknya   -  person charlietfl    schedule 26.01.2016


Jawaban (1)


Gunakan layanan $window sudut alih-alih window secara langsung, itulah yang Anda lakukan dalam tes Anda tetapi tidak dalam arahan Anda.

Kemudian Anda dapat meniru salah satu fungsinya:

spyOn($window, 'confirm').and.returnValue(false);
person andyhasit    schedule 26.01.2016