how to unit test DOM manipulation (with jasmine)

前端 未结 2 1456
不思量自难忘°
不思量自难忘° 2020-12-12 22:34

I need to unit test some DOM manipulation functions with jasmine (currently I run my tests in the browser and with Karma)

I was wondering what the best approach wou

相关标签:
2条回答
  • 2020-12-12 22:54

    I was looking for something for myself and finally I made a little library with 19 custom matchers. Maybe you'll find it helpful. https://github.com/devrafalko/jasmine-DOM-custom-matchers

    0 讨论(0)
  • 2020-12-12 23:05

    I've been using a helpful addition to jasmine called jasmine-jquery available on github.

    It gives you access to a number of useful extra matcher functions, to assert jquery objects and their properties.

    In particular the features I have found useful so far are asserting on attributes of dom elements, and spying on events such as clicks and submits...

    Here is a somewhat contrived example... :)

    describe("An interactive page", function() {
        it("'s text area should not contain any text before pressing the button", function() {
            expect(Page.textArea).toBeEmpty();
        });
    
        it("should contain a text area div", function() {
            expect(Page.textArea).toBe('div#textArea');
        });
    
        it("should append a div containing a random string to the text area when clicking the button", function() {
            var clickEvent = spyOnEvent('#addTextButton', 'click');
            $('button#addTextButton').click();
    
            expect('click').toHaveBeenTriggeredOn('#addTextButton');
            expect(clickEvent).toHaveBeenTriggered();
    
            expect($('div.addedText:last')).not.toBeEmpty());
        });
    });
    

    and here is the code:

    var Page = {
        title : 'a title',
        description : 'Some kind of description description',
        textArea : $('div#textArea'),
        addButton : $('button#addTextButton'),
    
    
        init : function() {
            var _this = this;
            this.addButton.click(function(){
            var randomString = _this.createRandomString();
                _this.addTextToPage(randomString);
            });
        },
    
        addTextToPage : function( text ) {
            var textDivToAdd = $('<div>').html('<p>'+text+'</p>');
    
            this.textArea.append( textDivToAdd );
        },
    
        createRandomString : function() {
            var text = "";
            var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
            for( var i=0; i < 5; i++ )
                 text += possible.charAt(Math.floor(Math.random() * possible.length));
    
            return text;
        },
    };
    
    Page.init();
    

    I've found jasmine to be really flexible and agreeable to use so far, I always appreciate pointers for making it the code better though!

    0 讨论(0)
提交回复
热议问题