将ember验收测试助手嵌入"然后"

时间:2016-09-23 15:56:25

标签: ember.js ember-cli acceptance-testing

我总是写这样的余烬测试:

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')
  });

  click('button.edit');
  fillIn('input.title', 'My edited post');
  click('button.submit');

  andThen(() => {
    assert.equal(find('ul.posts li:first').text(), 'My edited post')
  });
});

但我也看到了测试和#34;嵌套"这样的风格:

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')

    click('button.edit');
    fillIn('input.title', 'My edited post');
    click('button.submit');

    andThen(() => {
      assert.equal(find('ul.posts li:first').text(), 'My edited post')
    });
  });
});

一种方式比另一方更好还是正确?第一种风格可能成为竞争条件的来源吗?

我在github上查找了一些开源的ember应用程序,并且看到他们中的大多数都是这样做的:

https://github.com/cowbell/splittypie/blob/master/tests/acceptance/event-test.js

这是一个嵌套的例子:

https://github.com/HospitalRun/hospitalrun-frontend/blob/master/tests/acceptance/admin-test.js

2 个答案:

答案 0 :(得分:0)

您要嵌套的一些原因是

  • 如果以下测试取决于初始测试
  • 如果需要特定序列

我个人更喜欢与Date Time Caller Name Caller Number Call Duration 9/2/2015 4:03:18 PM John Smith (555) 444-1115 0:04:38 9/2/2015 10:53:09 AM Thomas Bush (555) 444-1115 N/A 9/2/2015 10:26:28 AM Burt Fenimore (555) 444-1115 0:05:53

一起嵌套

例如:

assert.async()

根据我的个人经验,然后并不总是按预期发生,特别是如果你的开发代码中有一个计时器,那么使用done确保我的所有测试都成功并按顺序完成

答案 1 :(得分:0)

使用andThen嵌套是没有充分理由的,尤其是现在您可以在Ember中使用async / await。第二个例子可以改写:

test('should add new post', async function(assert) {
  await visit('/posts/new');

  fillIn('input.title', 'My new post');
  await click('button.submit');

  assert.equal(find('ul.posts li:first').text(), 'My new post')

  await click('button.edit');
  fillIn('input.title', 'My edited post');
  await click('button.submit');

  assert.equal(find('ul.posts li:first').text(), 'My edited post')
});