【问题标题】:DalekJS and Mithril: Test are too fastDalekJS 和 Mithril:测试太快了
【发布时间】:2014-08-08 09:12:00
【问题描述】:

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

在.type() 进来之前一切都很好。

如果我 .type() input 中的某些东西具有双向绑定 m.prop 与 m.withAttr 然后 assert 该字段的值我会得到奇怪的行为。相反"test title" 我得到"tsttle"。似乎测试运行得太快了,Mithril 无法捕获更改并将它们呈现回 DOM。

如果输入相等的断言被删除——一切正常。

有什么解决方法,我可以减慢打字过程吗?

附言我使用 Chrome 浏览器作为测试运行器。

【问题讨论】:

  • 我不熟悉Dalek,但熟悉Mithril。秘银可能会重新绘制您描述中的每一次击键。您是否将onchange 与m.withAttr 一起使用?
  • 不,我使用onkeyup 事件。不幸的是,这是必需的行为。我还没有测试过,但我很确定它会通过onchange 事件进行双向检查的测试,并且有时间正确渲染。

标签: google-chrome dalekjs mithril.js


【解决方案1】:

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

你可以做的一件事,即使它看起来有点矫枉过正,就是添加一个带有显式等待的长函数链,如下所示:

.type('#selector', 'H')
.wait(500)
.type('#selector', 'e')
.wait(500)
.type('#selector', 'l')
.wait(500)
.type('#selector', 'l')
.wait(500)
.type('#selector', 'o')

您也可以继续编写一个实用函数来为您处理这些问题

function myType (selector, keys, test, wait) {
  var keysArr = keys.split('');
  keysArr.forEach(function (key) {
    test.type(selector, key).wait(wait);
  });

  return test;
}

然后像这样在你的测试中使用它:

module.exports = {
  'my test': function (test) {
    test.open('http://foobar.com');
    myType('#selector', 'Hello', test, 500);
    test.done();
  }
};

【讨论】:

  • 由于 Dalek 正在积极开发中,并且尚未实现所有功能(对于当前一代 JS 框架,它是“必须具备的功能”) - 这是目前最好的解决方案。感谢 Dalek 的回答!
【解决方案2】:

截至我撰写本文时,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。如果没有,那么您可以考虑在 keyHandler 中更新 mpropData。

【讨论】:

    【解决方案3】:

    Mithril 异步呈现以响应事件处理程序(基本上是为了让相关的事件组(如按键/输入)在重绘之前都有机会运行)

    您可以尝试一些方法:

    • 如果您可以从测试中访问数据模型,则可以针对该模型值(同步更新)运行断言,而不是使用仅在下一个动画帧上更新的 DOM 值

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

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

    【讨论】:

    • 问题似乎出在 Dalek 本身,正如 Sebastian Golasch 所解释的,必须在测试用例中实施变通方法。附言感谢 Mithril 的出色工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多