Google chrome DalekJS和Mithril:测试太快了
我使用Dalek测试我在Mithril框架帮助下编写的示例待办应用程序 一切正常,直到Google chrome DalekJS和Mithril:测试太快了,google-chrome,dalekjs,mithril.js,Google Chrome,Dalekjs,Mithril.js,我使用Dalek测试我在Mithril框架帮助下编写的示例待办应用程序 一切正常,直到.type()出现 如果我使用m.withAttr在input中使用m.prop双向绑定m.withAttr的type()内容,然后使用该字段的assert值,我将获得strage行为。取而代之的是“测试标题”我得到了“tsttle”。看起来测试运行得太快了,Mithril无法捕获更改并将其返回DOM 如果删除了对输入相等性的断言,那么所有这些都可以正常工作 有什么解决办法吗?我可以放慢打字速度吗 另外,我使用
.type()
出现
如果我使用m.withAttr
在input
中使用m.prop
双向绑定m.withAttr
的type()
内容,然后使用该字段的assert
值,我将获得strage行为。取而代之的是“测试标题”
我得到了“tsttle”
。看起来测试运行得太快了,Mithril无法捕获更改并将其返回DOM
如果删除了对输入相等性的断言,那么所有这些都可以正常工作
有什么解决办法吗?我可以放慢打字速度吗
另外,我使用Chrome浏览器作为测试运行程序。Mithril,在我写这篇文章时,会对onkey*事件进行重新渲染。一个避免这种情况的选择即将到来 您目前可以使用attr::config来处理onkey*事件,因为这不会导致重新加载。例如:
m('input', {config: addHandler});
function addHandler (el, isInitialized, context) {
if (!isinitialized) {
el.addEventListener('onkeyup', keyHandler, false);
}
}
function keyHandler (event) { /* do something with key press */ }
它可能{config:addHandler,onchange:m.withAttr('value',mpropData)}会做你想做的事情,但我不知道Dalek。如果没有,则可以考虑在密钥处理程序中更新MpRoDATA。
MiTrIL在事件处理程序中异步呈现(基本上使相关事件组(如按键/输入)都有机会在重绘之前运行)
您可以尝试以下几点:- 如果您可以从测试中访问数据模型,则可以针对该模型值(同步更新)运行断言,而不是使用仅在下一个动画帧上更新的DOM值
- 否则,可以在运行断言之前通过显式调用
(是,render,而不是redraw)强制同步重画,以确保视图与数据模型实际同步m.render
- 或者,您可以尝试在运行断言之前等待一个(或两个)动画帧
.type('#selector', 'H')
.wait(500)
.type('#selector', 'e')
.wait(500)
.type('#selector', 'l')
.wait(500)
.type('#selector', 'l')
.wait(500)
.type('#selector', 'o')
module.exports = {
'my test': function (test) {
test.open('http://foobar.com');
myType('#selector', 'Hello', test, 500);
test.done();
}
};
您还可以继续&编写一个实用函数来为您处理这个问题
function myType (selector, keys, test, wait) {
var keysArr = keys.split('');
keysArr.forEach(function (key) {
test.type(selector, key).wait(wait);
});
return test;
}
然后在测试中使用它,如下所示:
.type('#selector', 'H')
.wait(500)
.type('#selector', 'e')
.wait(500)
.type('#selector', 'l')
.wait(500)
.type('#selector', 'l')
.wait(500)
.type('#selector', 'o')
module.exports = {
'my test': function (test) {
test.open('http://foobar.com');
myType('#selector', 'Hello', test, 500);
test.done();
}
};
我不熟悉Dalek,但熟悉Mithril。Mithril可能会根据您的描述在每次击键时重新绘制。您是否将
onchange
与m.withAttr
一起使用?否,我使用onkeyup
事件。不幸的是,这是必需的行为。我还没有测试,但我对舒尔相当满意,它将通过双向检查的onchange
事件测试,并有时间正确渲染。正如Sebastian Golasch所解释的,问题似乎出在Dalek本身,必须在测试案例中实施变通方法。顺便说一句,谢谢你在米特里尔的出色工作!由于Dalek正在积极开发,并且尚未实现所有功能(对于当前一代的JS框架来说,它是“必须具备的功能”)——这是目前最好的解决方案。谢谢Dalek的回答!