- Ember.js 指南
- 入门指南 - 介绍
- 入门指南 - 应用规划
- 入门指南 - 创建静态页面
- 入门指南 - 获取Ember.js和相应依赖
- 入门指南 - 添加第一个路由与模板
- 入门指南 - 建立模型
- 入门指南 - 使用静态数据
- 入门指南 - 显示模型数据
- 入门指南 - 显示模型的完成状态
- 入门指南 - 创建新的模型实例
- 入门指南 - 标记模型为完成或未完成
- 入门指南 - 显示未完成待办事项的数量
- 入门指南 - 切换显示和编辑状态
- 入门指南 - 接受修改
- 入门指南 - 删除模型
- 入门指南 - 添加子路由
- 入门指南 - 显示未完成待办事项
- 入门指南 - 显示已完成待办事项
- 入门指南 - 显示所有待办事项
- 入门指南 - 添加移除所有已完成待办事项的按钮
- 入门指南 - 提示所有待办事项已完成
- 入门指南 - 切换已完成和未完成待办事项
- 入门指南 - 更换FixtureAdapter
- 获取 Ember - 获取Ember
- 概念 - 核心概念
- 概念 - 命名惯例
- 对象模型 - 类与实例
- 对象模型 - 计算属性
- 对象模型 - 计算属性和带@each的集合数据
- 对象模型 - 观察器
- 对象模型 - 绑定
- 对象模型 - 重新打开类和实例
- 对象模型 - 绑定,观察器,计算属性:如何选择?
- 应用 - 介绍
- 模板 - 应用模板
- 模板 - Handlebars基础
- 模板 - 条件表达式
- 模板 - 显示项目列表
- 模板 - 切换作用域
- 模板 - 绑定元素属性
- 模板 - 绑定元素类名称
- 模板 - 链接
- 模板 - 操作
- 模板 - 输入助手
- 模板 - 开发助手
- 模板 - 用助手来渲染
- 模板 - 编写助手方法
- 路由 - 介绍
- 路由 - 定义路由
- 路由 - 生成的对象
- 路由 - 指定路由的模型
- 路由 - 设置控制器
- 路由 - 渲染模板
- 路由 - 重定向
- 路由 - 指定地址API
- 路由 - 查询参数
- 路由 - 异步路由
- 路由 - 加载中/错误子状态
- 路由 - 阻止和重试过渡
- 组件 - 介绍
- 组件 - 定义组件
- 组件 - 传递属性
- 组件 - 包裹内容
- 组件 - 自定义组件元素
- 组件 - 使用Action处理用户交互
- 组件 - 从组件发送操作给应用
- 控制器 - 介绍
- 控制器 - 代表单一模型
- 控制器 - 代表多模型
- 控制器 - 管理控制器间的依赖
- 模型 - 介绍
- 模型 - 定义模型
- 模型 - 创建和删除记录
- 模型 - 将记录推入仓库
- 模型 - 持久化记录
- 模型 - 查询记录
- 模型 - 使用记录
- 模型 - 使用Fixture
- 模型 - 连接HTTP服务器
- 模型 - 处理元数据
- 模型 - 自定义适配器
- 模型 - 常见问题
- 视图 - 介绍
- 视图 - 定义视图
- 视图 - 处理事件
- 视图 - 在模板中插入视图
- 视图 - 为视图添加布局
- 视图 - 自定义视图元素
- 视图 - 内置视图
- 视图 - 手动管理视图层级
- 枚举 - 介绍
- 测试 - 介绍
- 测试 - 集成测试
- 测试 - 测试助手
- 测试 - 测试用户交互
- 测试 - 单元测试
- 测试 - 单元测试基础
- 测试 - 测试组件
- 测试 - 测试控制器
- 测试 - 测试路由
- 测试 - 测试模型
- 测试 - 自动化测试
- 配置Ember.js - 禁用基本类型扩展
- 配置Ember.js - 嵌入式应用
- 配置Ember.js - 特性标识
- Cookbook - 简介
- Cookbook - 用户界面与交互
- Cookbook - 事件处理和数据绑定
- Cookbook - 助手与组件
- Cookbook - 使用对象
- 理解Ember.js - 视图层
- 理解Ember.js - 管理异步
- 理解Ember.js - 模板自动更新
- 理解Ember.js - 调试
- 理解Ember.js - 运行循环
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
测试 - 测试控制器
英文原文: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'); }); }); |
在线示例
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论