- 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/test-helpers/
测试Web应用最大的问题是代码都是事件驱动的,因此很可能出现异步的情况(例如输出与输入不是按照顺序发送)。其衍生问题就是代码可能会以任何可能的顺序执行。
下面这个例子能很好的说明此问题:当一个用户点击了两个按钮,一个接着一个,分别从不同的服务器加载数据。这种情况响应的时间是不同的。
当编写测试时,应该敏锐地意识到,在发送了一个请求之后,并无法立即得到返回的响应,因此断言的代码(“测试者”)需要以同步的状态来等待被测试的事物(“被测对象”)。例如上面所举例子,应该等待两个服务器都返回数据,这时测试代码才执行其逻辑来检测数据的正确性(不论是模仿的数据,还是真实的)。
这就是为什么Ember的测试助手当其做断言的时候,都是被包裹爱确保在一个同步状态的代码中。这样做避免对所有这样的代码都去做这样的包裹,并且因为减少了模板代码,提高了测试代码的可读性。
Ember包含一些助手来辅助完成集成测试。主要有两类助手:同步的和异步的。
异步助手
异步助手能感知到应用中得异步行为,并会等待这些异步行为,这使得更加容易编写判定测试。
visit(url)
- 访问指定的路由并返回一个将在所有异步行为完成后得到履行的承诺。fillIn(input_selector, text)
- 在选定的输入出填入给定的文本,并返回一个在所有异步行为完成后会履行的承诺。click(selector)
- 点击选定的元素,触发元素click
事件会触发的所有操作,并返回一个在所有异步行为完成后会履行的承诺。keyEvent(selector, type, keyCode)
- 模拟一个键盘事件,例如:在选定元素上的带有keyCode
的keypress
,keydown
,keyup
事件。triggerEvent(selector, type, options)
- 触发指定事件,如指定选择器的元素上的blur
,dblclick
事件。
同步助手
同步助手在触发时立即执行。
find(selector, context)
- 在应用的根元素中找到指定上下文(可选)的一个元素。限定到根元素可以有效的避免与测试框架的报告发生冲突,如果上下文没有指定,那么这将按照缺省的完成。currentPath()
- 返回当前路径。currentRouteName()
- 返回当前活动路由名。currentURL()
- 返回当前URL。
等待助手
andThen
助手将等待之前所有异步助手完成才开始执行。下面通过一个示例来说明:
1 2 3 4 5 6 7 8 9 10 11 12 | test("simple test", function(){ expect(1); // Ensure that we will perform one assertion visit("/posts/new"); fillIn("input.title", "My new post"); click("button.submit"); // Wait for asynchronous helpers above to complete andThen(function() { equal(find("ul.posts li:last").text(), "My new post"); }); }); |
注意上例中使用了andThen
助手。也就是说会等待之前所有的异步测试助手完成处理后,才会执行传给andThen
的函数中得代码。
自定义测试助手
Ember.Test.registerHelper
和Ember.Test.registerAsyncHelper
都是用来在调用App.injectTestHelpers
调用时,注册将被注入的测试助手的。两者的不同之处在于,Ember.Test.registerAsyncHelper
只有所有之前的异步助手都完成了,并且后续的助手不需要等待其完成来运行的时候才会运行。
助手方法将总是作为当前应用的第一个参数来被调用。助手需要在调用App.injectTestHelpers()
之前进行注册。
下例为一个同步助手:
1 2 3 4 5 6 7 8 9 | Ember.Test.registerHelper('shouldHaveElementWithCount', function(app, selector, n, context) { var el = findWithAssert(selector, context); var count = el.length; equal(n, count, 'found ' + count + ' times'); } ); // shouldHaveElementWithCount("ul li", 3); |
下例是一个异步助手:
1 2 3 4 5 6 7 8 9 10 | Ember.Test.registerAsyncHelper('dblclick', function(app, selector, context) { var $el = findWithAssert(selector, context); Ember.run(function() { $el.dblclick(); }); } ); // dblclick("#person-1") |
异步助手也可以用来将一组操作合并为一个助手。例如:
1 2 3 4 5 6 7 8 9 | Ember.Test.registerAsyncHelper('addContact', function(app, name, context) { fillIn('#name', name); click('button.create'); } ); // addContact("Bob"); // addContact("Dan"); |
示例
这里有一个使用registerHelper
和registerAsyncHelper
的例子。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论