2012-07-11 112 views
4

經過幾個月沒有看到emberjs,我現在試圖回到它,因此我正在嘗試新的路由器。我想測試我的路線。你如何測試你的emberjs路線?

有沒有人試圖用emberjs寫一些路由測試?

讓我們假設非常基本的路由器如下:

App.Router = Ember.Router.extend({ 
    root: Ember.Route.extend({ 
    index: Ember.Route.extend({ 
     route: '/', 
     connectOutlets: function(router, context) { 
     router.get('applicationController').connectOutlet({name: 'home'}); 
     } 
    }) 
    }) 
}) 

你怎麼測試正確加載root.index路線加載HomeView

回答

4

這裏是灰燼如何已經測試了connectOutlet爲您提供:

https://github.com/emberjs/ember.js/blob/master/packages/ember-views/tests/system/controller_test.js

test("connectOutlet instantiates a view, controller, and connects them", function() { 
    var postController = Ember.Controller.create(); 

    var appController = TestApp.ApplicationController.create({ 
    controllers: { postController: postController }, 
    namespace: { PostView: TestApp.PostView } 
    }); 
    var view = appController.connectOutlet('post'); 

    ok(view instanceof TestApp.PostView, "the view is an instance of PostView"); 
    equal(view.get('controller'), postController, "the controller is looked up on the parent's controllers hash"); 
    equal(appController.get('view'), view, "the app controller's view is set"); 
}); 

其他路由相關的測試可以在https://github.com/emberjs/ember.js/tree/master/packages/ember-routing/tests

+0

謝謝,但我無法從它的實例中獲得視圖的名稱。 我想檢查它是否呈現適當的視圖。不只是一些東西。 – 2012-07-11 14:28:49

+0

查看instanceof TestApp.PostView顯示該視圖是PostView的一個實例,對於視圖的其他細節,您可以直接使用變量視圖進行檢查。你真正的意思是「從它的實例中獲取視圖的名稱」 – sabithpocker 2012-07-11 14:34:33

+0

'instanceof'正是我正在尋找的東西! \ o/:) – 2012-07-11 15:16:35

11

以下是完整的測試,使用Jasmine & Sinon

代碼:

describe("Given the Router", function(){ 

    var router = null; 

    beforeEach(function(){ 
     router = Router.create(); 
    }); 

    afterEach(function(){ 
     router = null; 
    }); 

    it("Should be defined", function(){ 
     expect(router).toBeDefined(); 
    }); 

    it("Should have an root route", function(){ 
     expect(router.get("root")).toBeDefined(); 
    }); 

    describe("its root route", function(){ 
     var root = null; 
     beforeEach(function(){ 
      root = router.get("root").create(); 
     }); 

     afterEach(function(){ 
      root = null; 
     }); 

     it("should have an index route", function(){ 
      expect(root.get("index")).toBeDefined(); 
     }); 

     describe("its index route", function(){ 
      var indexRoute = null; 
      beforeEach(function(){ 
       indexRoute = root.get("index").create(); 
      }); 

      it ("should have route of /", function(){ 
       expect(indexRoute.get("route")).toEqual("/"); 
      }); 

      it ("should connect the outlets to home", function(){ 

       var fakeRouter = Em.Object.create({applicationController: {connectOutlet: function(){} } }); 

       var connectOutletSpy = sinon.spy(fakeRouter.applicationController, "connectOutlet"); 

       var methodCall = connectOutletSpy.withArgs({name:"home"}); 

       indexRoute.connectOutlets(fakeRouter); 

       expect(methodCall.calledOnce).toBeTruthy(); 
      }); 
     }); 
    }); 
}); 

希望它能幫助。

+0

是找到了,但是檢查該路由定義ISN夠了。我需要檢查加載路由時是否顯示相應的視圖。 – 2012-07-11 13:59:50

+0

我剛剛用完整的測試代碼更新了答案。基本上,你只是想測試你的路線是用正確的參數調用「connectOutlet」函數,接下來發生的是Ember的責任。如果你是單元測試,你希望儘可能的隔離測試,這意味着與你的Route之外的其他組件隔離。 – 2012-07-11 14:29:19