测试控制器 编辑页面
英文原文:http://emberjs.com/guides/testing/testing-controllers/
单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller
集成自Ember.Object
。
针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。
测试控制器操作
下面给出一个PostsController
控制器,控制器有一些计算属性和一个setProps
操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
App.PostsController = Ember.ArrayController.extend({ propA: 'You need to write tests', propB: 'And write one for me too', setPropB: function(str) { this.set('propB', str); }, actions: { setProps: function(str) { this.set('propA', 'Testing is cool'); this.setPropB(str); } } }); |
setProps
设置控制器的一个属性并调用一个方法。为这个操作编写测试,需要使用moduleFor
助手来设置一个测试容器:
1 |
moduleFor('controller:posts', 'Posts Controller'); |
接下来使用this.subject()
来获取PostsController
的一个实例,并编写一个测试来检测这个操作。this.subject()
是ember-qunit库提供的一个助手方法,其返回moduleFor
设置的模块的一个单例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
test('calling the action setProps updates props A and B', function() { expect(4); // get the controller instance var ctrl = this.subject(); // check the properties before the action is triggered equal(ctrl.get('propA'), 'You need to write tests'); equal(ctrl.get('propB'), 'And write one for me too'); // trigger the action on the controller by using the `send` method, // passing in any params that our action may be expecting ctrl.send('setProps', 'Testing Rocks!'); // finally we assert that our values have been updated // by triggering our action. equal(ctrl.get('propA'), 'Testing is cool'); equal(ctrl.get('propB'), 'Testing Rocks!'); }); |
在线示例
测试控制器依赖
有时候控制器需要依赖其他控制器。这通过needs来实现。例如,下面有两个简单的控制器。PostController
是CommentsController
的一个依赖:
1 2 3 4 5 6 7 8 |
App.PostController = Ember.ObjectController.extend({ // ... }); App.CommentsController = Ember.ArrayController.extend({ needs: 'post', title: Ember.computed.alias('controllers.post.title'), }); |
在设置moduleFor
之时,需要将一个选项对象作为第三个参数,该参数是控制器的needs
。
1 2 3 |
moduleFor('controller:comments', 'Comments Controller', { needs: ['controller:post'] }); |
下面来写一个,测试中设置PostController
中得post
模型的一个属性,这个属性在CommentsController
同样有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
test('modify the post', function() { expect(2); // grab an instance of `CommentsController` and `PostController` var ctrl = this.subject(), postCtrl = ctrl.get('controllers.post'); // wrap the test in the run loop because we are dealing with async functions Ember.run(function() { // set a generic model on the post controller postCtrl.set('model', Ember.Object.create({ title: 'foo' })); // check the values before we modify the post equal(ctrl.get('title'), 'foo'); // modify the title of the post postCtrl.get('model').set('title', 'bar'); // assert that the controllers title has changed equal(ctrl.get('title'), 'bar'); }); }); |