Menguji arahan sudut yang menghapus elemen dom tidak berfungsi (setidaknya untuk saya)

Saya punya arahan yang menghapus elemen dom setelah beberapa pemeriksaan izin:

angular.module('app').directive('permissionNeeded', function ($location, $route, SecurityService) {
    return {
        restrict: 'A',
        link: function (scope, element, attributes) {

            var permissionNeeded = attributes.permissionNeeded;

            if (permissionNeeded) {
                if (SecurityService.checkAccess($route.current.name) !== permissionNeeded) {
                    element.remove();
                }
            }
        }
    };
});

Petunjuk berfungsi dengan baik, namun saya tidak dapat mengujinya. Manipulasi DOM (element.remove()) tampaknya dipicu setelah pernyataan yang saya harapkan:

 it('should not do anything cos permissions are correct', function () {
        $route.current = {
            name: 'import'
        }
        var element = compileTemplate('<span permission-needed="W">Some content goes here</span>');
        $rootScope.$digest();
        expect(element.html()).toBe(''); // FAIL!!! it's still equals to 'Some Content goes here'
    });

Saya telah melihat beberapa jawaban di SO tentang penggunaan fungsi $timeout untuk menunda pernyataan ekspektasi, tetapi apa pun yang saya coba, pernyataan tersebut gagal (element.html() masih sama dengan 'Beberapa konten ada di sini')

Namun, yang lucu (bukan?) adalah jika saya hanya mengubah dom alih-alih menghapusnya dalam arahan saya, pengujian saya baik-baik saja:

angular.module('app').directive('permissionNeeded', function ($location, $route, SecurityService) {
    return {
        restrict: 'A',
        link: function (scope, element, attributes) {

            var permissionNeeded = attributes.permissionNeeded;

            if (permissionNeeded) {
                if (SecurityService.checkAccess($route.current.name) !== permissionNeeded) {
                    element.html('');
                }
            }
        }
    };
});

menggunakan arahan di atas, tes berhasil.

Apakah saya benar ketika saya kira rendering dom belum berakhir ketika saya membuat pernyataan? Jika demikian, apa yang dapat saya lakukan untuk menunda pernyataan saya setelah rendering DOM?

Terima kasih.

Mathieu.


person Mat    schedule 09.01.2014    source sumber
comment
Dalam arahan pertama Anda, Anda melakukan element.remove() yang berarti elemen tersebut akan terlepas dari DOM atau setidaknya seharusnya demikian, menurut saya.   -  person dcodesmith    schedule 10.01.2014
comment
Saya pikir dcodesmith benar, elemennya masih berupa elemen, baru saja dihapus dari dom, Anda ingin menguji apakah elemen tersebut telah dihapus dari parentNode.   -  person jeffmayeur    schedule 10.01.2014
comment
Terima kasih Anda berdua, Anda benar (lihat jawaban @LostInComputer di bawah)   -  person Mat    schedule 10.01.2014


Jawaban (1)


Saat Anda menjalankan element.remove(), ia hanya menghapus elemen dari induknya, menghapus peristiwa terikat, dll.

Solusi terpendek adalah dengan menyertakan arahan dalam elemen induk:

var element = compileTemplate('<div><span permission-needed="W">Some content goes here</span></div>');

Kemudian

expect(element.html()).toBe('')

akan berlalu karena element tidak lagi berisi span

person LostInComputer    schedule 10.01.2014
comment
bisakah Anda menambahkan potongan - person Evan Lévesque; 15.07.2014