How do I test this with the Jasmine Test (Behavior Driven Development)?

I just developed this JavaScript / Backbone module as part of a webpage that I am developing. I would like to create a Jasmine test for it, but I am completely new to Jasmine, so I am not sure what should I test in this class. What should be the "skeleton" of the test? To avoid redundancy in tests, which parts will you check?

editdestinationview.js:

define([
    'common/jqueryex',
    'backbone',
    'marionette',
    'handlebars',
    'text!education/eet/templates/editdestination.hb',
    'text!common/templates/validationerror.hb',
    'lang/languageinclude',
    'common/i18nhelper'
], function ($, Backbone, Marionette, Handlebars, templateSource, errorTemplateSource, i18n) {
    'use strict';

    var errorTemplate = Handlebars.compile(errorTemplateSource),
        EditDestinationView = Marionette.ItemView.extend({

            initialize: function (options) {
                this._destinationTypes = options.destinationTypes;
            },

            onRender: function () {
                this.stickit();
                this._bindValidation();
            },

            _bindValidation: function () {
                Backbone.Validation.bind(this, {
                    valid: this._validAttributeCallback,
                    invalid: this._invalidAttributeCallback,
                    forceUpdate: true
                });
            },

            _validAttributeCallback: function (view, attr) {
                view.$('#error-message-' + attr).remove();
            },

            _invalidAttributeCallback: function (view, attr, error) {
                view.$('#error-message-' + attr).remove();
                view.$('#destinationTypes').parent('div').append(errorTemplate({
                    attr: attr,
                    error: error
                }));
            },

            template: Handlebars.compile(templateSource),

            ui: {
                saveAnchor: '#ed_eetSaveDestinationAnchor',
                deleteAnchor: '#ed_eetDeleteDestinationIcon'
            },

            triggers: {
                'click @ui.saveAnchor': 'click:saveDestination',
                'click @ui.deleteAnchor': 'click:deleteDestination'
            },

            bindings: {
                'select#destinationTypes': {
                    observe: 'destinationTypeId',
                    selectOptions: {
                        collection: function () {
                            return this._destinationTypes;
                        },
                        labelPath: 'description',
                        valuePath: 'destinationTypeId',
                        defaultOption: {label: i18n.EDUCATION_EET_SELECT_INTENDED_DESTINATION, value: null}
                    }
                }
            }

        });

    return EditDestinationView;
});

      

Thanks everyone!

UPDATE: After thinking about this a lot, I think I should try these aspects: -Triggers: check if you can push them. - "_ validAttributeCallback" and "_invalidAttributeCallback": check if they behave appropriately to the code. -Template: Spy on it to check if it completes the mission. (Optional test)

So the test skeleton would be:

define([
    'education/eet/views/editdestinationview'
], function (EditDestinationView) {

    describe('description...', function () {

        beforeEach(function () {
            //EditDestinationView.triggers
        });

        describe('blablabla', function () {

            beforeEach(function () {
//                ...
            });

            it('blablabla', function () {
//      blablabla
            });

        });
    });

});

      

Any help on how to check this please?

+3


source to share


1 answer


One common pattern is to use two statements describe

, one for the class and one for the method under test, and then a statement it

for every thing you want to test about that method. The rspec people have a convention (which I use in my JS tests) using "#" for method describe

for instance method and ".". for a describe

static method.

Now, if you take all of the above and want to check (for example) that your click handling method View

fires a specific event on View

Model

, it will look something like this:

define([
    'education/eet/views/editdestinationview'
], function (EditDestinationView) {
    describe('EditDestinationView', function () {
        var view;
        beforeEach(function () {
            // do setup work that applies to all EditDestinationView tests
            view = new EditDestinationView({model: new Backbone.Model()});
        });
        describe('#handleClick', function () {
            beforeEach(function () {
                // do setup work that applies only to handleClick tests
            });
            it('triggers a foo event', function () {
                var wasTriggered;
                view.model.on('foo', function() {
                    wasTriggered = true;
                });
                view.handleClick();
                expect(wasTriggered).toBe(true);
            });
        });
    });
});

      



PS Instead of creating a fake "foo" handler like me, most people use a mocking library like Sinon. Using this library, our "it" operator could be:

            it('triggers a foo event', function () {
                var triggerStub = sinon.stub(view.model, 'trigger');
                view.handleClick();
                expect(triggerStub.calledOnce).toBe(true);
                expect(triggerStub.args[0][0]).toBe('foo');
                //NOTE: args[0][0] == first arg of first call
            });

      

+1


source







All Articles