Javascript Ember.JS集成测试问题,然后单击helpers

Javascript Ember.JS集成测试问题,然后单击helpers,javascript,ember.js,integration-testing,Javascript,Ember.js,Integration Testing,我在Ember的测试助手中得到了奇怪的结果,然后和单击。根据恩伯的报告: 和第助手将等待前面的所有异步助手 在前进之前完成 然而,我发现情况并非总是如此。在下面的示例中,有3个console.debug语句。我希望他们以A->B->C的顺序登录。但我始终得到这个顺序:A->C->B。我只能在使用两个单击帮助程序中的一个时才能得到预期的ABC顺序。没有与click helpers中引用的元素关联的事件侦听器(操作) 有人能解释这种意外的行为吗?我使用助手时有错误吗?或者是Ember的测试框架的bu

我在Ember的测试助手中得到了奇怪的结果
,然后
单击
。根据恩伯的报告:

和第
助手将等待前面的所有异步助手 在前进之前完成

然而,我发现情况并非总是如此。在下面的示例中,有3个
console.debug
语句。我希望他们以A->B->C的顺序登录。但我始终得到这个顺序:A->C->B。我只能在使用两个单击帮助程序中的一个时才能得到预期的ABC顺序。没有与click helpers中引用的
元素关联的事件侦听器(操作)

有人能解释这种意外的行为吗?我使用助手时有错误吗?或者是Ember的测试框架的bug

andThen(function() {
    console.debug('mark A');

    click('div:first'); // with just 1 click helper, debug order is ABC
    click('div:first'); // with this second click helper, debug order is ACB

    andThen(function() {
        console.debug('mark B');
    });
});

andThen(function() {
    console.debug('mark C');
});

编辑

根据Kingpin2k给出的答案,我最终采用了以下解决方案,以获得我所寻求的测试风格

首先,我创建了一个名为
next
的异步测试助手。其次,我用自定义的
next
帮助程序替换了代码中的所有
帮助程序。这使我的代码能够按我期望的顺序运行

// test-helper.js
Ember.Test.registerAsyncHelper('next', function(app, fn) {
    fn();
});

// my-integration-test.js
next(function() {
    console.debug('mark A');

    click('div:first');
    click('div:first');

    next(function() {
        console.debug('mark B');
    });
});

next(function() {
    console.debug('mark C');
});

然后
只是创建了
lastpromiseembersaw的语法糖。然后
看起来像这样:

lastPromiseEmberSawCreated.then(function(){
  console.debug('mark A');

    click('div:first'); // with just 1 click helper, debug order is ABC
    click('div:first'); // with this second click helper, debug order is ACB

  nextLastPromiseEmberSawCreated.then(function() {
        console.debug('mark B');
    });
});

// the promise won't have changed in between these two `andThen` calls 
// because Ember had no cpu time, and you didn't make any additional calls 

lastPromiseEmberSawCreated.then(function(){
    console.debug('mark C');
});

不再有理由在测试中使用
,这有望减少混淆。您可以重写示例(假设该示例位于标记为
async
的函数中):

console.debug('mark A');

await click('div:first');
await click('div:first');

console.debug('mark B');

console.debug('mark C');

语句按顺序执行。

您的解释与我在上的文档中理解的不同。但是您的解释很有意义,并引导我找到了我在编辑的文章中描述的解决方案。它有点隐藏,但在这条语句中暗示了它
注意,然后有一个包含de将在其他测试帮助程序完成后执行。
,但此语句
第二个帮助程序将等待前面的所有异步帮助程序完成,然后再继续执行。
具有误导性,您确实需要一起阅读它们以获得准确的语句。这确实意味着插入的代码在cu之前不会执行当前的全局承诺完成了,但它将继续在第三个之外使用代码。