2012-07-11 116 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