Lorraine Bernard
Lorraine Bernard

Reputation: 13430

Testing Backbone Model using Jasmine

It is the first time I write a javascript test for a Backbone Model.
Looking in the web resource there are not so many items about this subject.
I found this one, Testing Backbone applications with Jasmine and Sinon, which is pretty old (mars 2001).

Anyway I would like to know:
1) there are other resource more update about this subject
2) the text I wrote (1) is fine or can be improved.


(1)

describe('User model', function () {
    beforeEach(function () {
        this.model = new User();
        this.collection = new UserCollection();
    });

    describe('When creating models', function () {
        it('the url should be equal at corresponding api_get_users value', function () {
            expect(this.model.url()).toEqual(backendRouter.generate('api_get_users'));
        });

        describe('when no id is set', function () {
            it('should return the collection URL', function () {
                expect(this.model.url()).toEqual(this.collection.url);
            });

        });
        describe('when id is set', function () {
            it('should return the collection URL and id', function () {
                this.model.set({id: 1});
                expect(this.model.url()).toEqual(this.collection.url + '/' + this.model.get('id'));
            });
        });

    });

    describe('when fetching model from server', function () {
        beforeEach(function () {
            this.model.set({id: 1});
            this.fixture = this.fixtures.Users.valid;
            this.fixtureResponse = this.fixture.response.users[0];
            this.server = sinon.fakeServer.create();
            this.server.respondWith(
                'GET',
                backendRouter.generate('api_get_users') + '/' + this.model.get('id'),
                JSON.stringify(this.fixtureResponse)
            );
        });

        afterEach(function () {
            this.server.restore();
        });

        it('should make the correct request', function () {
            this.model.fetch();
            expect(this.server.requests.length).toEqual(1);
            expect(this.server.requests[0].method).toEqual('GET');
            expect(this.server.requests[0].url).toEqual(this.model.url());
        });

        it('should the response not change', function () {
            this.model.fetch();
            this.server.respond();
            expect(this.fixtureResponse).toEqual(this.model.attributes);
        });

        it('should exhibit mandatory attributes', function () {
            expect(this.model.get('id')).toBeGreaterThan(0);
        });
    });

});

Upvotes: 4

Views: 2867

Answers (2)

Andreas Köberle
Andreas Köberle

Reputation: 111062

Maybe SO is not the right place for code reviews, take a look at https://codereview.stackexchange.com/. Some notes any way:

describe('when id is set', function () {
    it('should return the collection URL and id', function () {
        this.model.set({id: 1});
        expect(this.model.url()).toEqual(this.collection.url + '/' + this.model.get('id'));
    });
});

You should test for this.collection.url + '/' + 1, cause this is what you wanna send to the server. Maybe you will change the get function of your model latterly, the test will pass but the outcome is not what you expect.

it('should make the correct request', function () {
        this.model.fetch();
        expect(this.server.requests.length).toEqual(1);
        expect(this.server.requests[0].method).toEqual('GET');
        expect(this.server.requests[0].url).toEqual(this.model.url());
    });  

This test is pointless cause you just test Backbone functionality, that is hopefully tested by the Backbone people. Same for the other 2 tests. As long as you do not magic stuff in your model it makes no sense to test the default Backbone functionality.

Upvotes: 2

Dennis Burton
Dennis Burton

Reputation: 3333

Nobody covers jasmine testing better than Justin Searls:

https://speakerdeck.com/u/searls/p/confidencejs

is one example but check out his other presentations as well and his github repo for jasmine-given

Upvotes: 1

Related Questions