Google chrome DalekJS和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 如果删除了对输入相等性的断言,那么所有这些都可以正常工作 有什么解决办法吗?我可以放慢打字速度吗 另外,我使用

我使用Dalek测试我在Mithril框架帮助下编写的示例待办应用程序

一切正常,直到
.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值

  • 否则,可以在运行断言之前通过显式调用
    m.render
    (是,render,而不是redraw)强制同步重画,以确保视图与数据模型实际同步

  • 或者,您可以尝试在运行断言之前等待一个(或两个)动画帧


这确实是一个有趣的问题,但问题是Dalek无法控制键入字母的速度。这是因为JSON Wire协议没有为我们提供处理该问题的方法,请参阅

您可以做的一件事是添加一个带有显式等待的长函数链,即使这看起来有些过分,如下所示:

.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的回答!