2016-12-20 17 views
0

我需要一个emberJs验收测试才能够滚动到页面中的某个点,然后才能声明有关该页面的内容。Ember验收测试和Then()不会等到滚动事件完成

这两个函数,

Ember.$('body').scrollTop(1000); 

window.scroll(0,1000); 

随后当由

andThen(()=>{ 
    console.log('body', Ember.$('body').scrollTop()); 
}) 

打印出身体scrollTop的位置是在108我需要它是在1000

我可以到达body scrollTop在1000的那一刻的唯一方法是当我使用此回调时:目前为止:

Ember.$('body').animate({scrollTop: 1000},() => { 
    console.log('body', Ember.$('body').scrollTop()); 
    staticWiz.assertHasGoToTopButton(true); 
}); 

这里的问题是没有一个测试的东西存在这个回调发生的地步。我无法断言任何事情。

如果我尝试使用此回调使用assert.async()和()完成,这使得它过早地火的时候,身体scrollTop的()是108:

const done = assert.async(); 
Ember.$('body').animate({scrollTop: 1000},() => { 
    console.log('body', Ember.$('body').scrollTop()); 
    staticWiz.assertHasGoToTopButton(true); 
    done(); 
}); 

如果我设定循环超时作为检查滚动位置的一种方式,它仅保持在108的相同位置上。

const done = assert.async(); 
window.scroll(0, 1000); 
const checkScroll =() => { 
    console.log('body', Ember.$('body').scrollTop()); 
    if (Ember.$('body').scrollTop() === 1000) { 
    staticWiz.assertHasGoToTopButton(true); 
    done(); 
    return; 
    } 
    setTimeout(checkScroll, 1000); 
}; 
checkScroll(); 

所以,有任何想法吗?有没有人为他们做过这个工作,在这种情况下,你不能有任何的滚动程度,但需要一个具有Emberjs验收测试的特定数字?

更新:同事刚刚意识到测试页面正在通过测试滚动而不是测试页面内嵌套的应用程序主体。我们的应用中的“body”滚动观察者不会在测试页面的应用窗口中选取滚动条。不知道该从哪里出发。

回答

4

完成此工作的一种方法是使用Ember中的低级别waiter功能。

参见:http://emberjs.com/api/classes/Ember.Test.html#method_registerWaiter

这里基本上你将如何使用它:

function finishedScrolling() { 
    return Ember.$('body').scrollTop() === 1000; 
} 

Ember.Test.registerWaiter(finishedScrolling); 

Ember.$('body').animate({scrollTop: 1000}); 

andThen(function() { 
    Ember.Test.unregisterWaiter(finishedScrolling); 
    staticWiz.assertHasGoToTopButton(true); 
}); 

看到它在这里工作:https://ember-twiddle.com/1407bbadbb13365181f91201de6ba46c?openFiles=tests.acceptance.my-acceptance-test.js%2C