codecamp

Ember 验收测试

验收测试

使用ember generate acceptance-test创建一个验收测试,比如:

ember g acceptance-test login

执行完毕命令之后得到如下文件内容:

//tests/acceptance/login-test.js


import { test } from 'qunit';
import moduleForAcceptance from 'people/tests/helpers/module-for-acceptance';


moduleForAcceptance('Acceptance | login');


test('visting /login', function(assert) {
  visit('/login');


  andThen(function() {
   assert.equal(currentURL(), '/login');
  });
});

moduleForAcceptance用来启动、终止程序。最后几行test中包含了一个示例。

几乎所有的测试都有一个路由请求,用于和页面交互(通过helper)并检查DOM是否按照期望值进行改变。

举个例子:

test('should add new post', function(assert) {
  visit('/posts/new');
  fillIn('input.title', 'My new post');
  click('button.submit');
  andThen(() => assert.equal(find('ul.posts li:first').text(), 'My new post'));
});

大体意思为: 进入路由/posts/new,在输入框input.title填入My new post,点击button.submit,期望的结果是: 在对应列表下ul.posts li.first的文本为My new post.

测试助手

在测试web应用中的一个主要的问题是,由于代码都是基于事件驱动的,因此他们有可能是异步的,会使代码无序运行。

比如有两个按钮,从不同的服务器载入数据,我们先后点击他们,但可能结果返回的顺序并不是我们点击的顺序。

当你在编写测试的时候,你需要特别注意一个问题,就是你无法确定在发出一个请求后,是否会立刻得到返回的响应。因此,你的断言需要以同步的状态来等待被测试体。例如上面所举的例子,应该等待两个服务器均返回数据后,这时测试代码才会执行其逻辑来检测数据的正确性。

这就是为什么在做断言的时候,Ember测试助手都是被包裹在一个确保同步状态的代码中。这样做避免了对所有这样的代码都去做这样的包裹,并且因为减少了模板代码,从而提高了代码的可读性.

Ember包含多个测试助来辅助进行验收测试。一共有2种类型:异步助手asynchronous和同步助手synchronous

异步测试助手

异步测试助手可以意识到程序中的异步行为,使你可以更方便的编写确切的测试。

同时,这些测试助手会按注册的顺序执行,并且是链式运行。每个测试助手的调用都是在前一个调用结束之后,才会执行下一个。因此,你可以不用当心测试助手的执行顺序。

  • click(selector)
    • 点击一个元素,触发该元素所绑定的click事件,返回一个异步执行成功的promise
  • fillIn(selector, value)
    • 用执行成功的promise值填充到选中的input元素上。使用时,记得