Testing routers in backbone.js properly?

前端 未结 6 917
太阳男子
太阳男子 2021-01-30 13:56

So I\'ve just started to write tests for my in-progress javascript app, using sinon.js & jasmine.js. Works pretty well overall, but I need to also

6条回答
  •  礼貌的吻别
    2021-01-30 14:19

    Here's what I ended up using myself. I made a mock version of the router by extending it and overriding the methods with a blank method to prevent it from invoking any further logic when being called:

    describe("routers/main", function() {
    
        beforeEach(function() {
    
            // Create a mock version of our router by extending it and only overriding
            // the methods
            var mockRouter = App.Routers["Main"].extend({
                index: function() {},
                login: function() {},
                logoff: function() {}
            });
    
            // Set up a spy and invoke the router
            this.routeSpy = sinon.spy();
            this.router = new mockRouter;
    
            // Prevent history.start from throwing error
            try {
                Backbone.history.start({silent:true, pushState:true});
            } catch(e) {
    
            }
    
            // Reset URL
            this.router.navigate("tests/SpecRunner.html");
        });
    
        afterEach(function(){
            // Reset URL
            this.router.navigate("tests/SpecRunner.html");
        });
    
        it('Has the right amount of routes', function() {
            expect(_.size(this.router.routes)).toEqual(4);
        });
    
        it('/ -route exists and points to the right method', function () {
            expect(this.router.routes['']).toEqual('index');
        });
    
        it("Can navigate to /", function() {
            this.router.bind("route:index", this.routeSpy);
            this.router.navigate("", true);
            expect(this.routeSpy.calledOnce).toBeTruthy();
            expect(this.routeSpy.calledWith()).toBeTruthy();
        });
    
    });
    

    Note that sinon.js is used above to create the spy, along with underscore.js to provide the size function.

提交回复
热议问题