DalekJS和Mithril:测试太快了

时间:2014-08-08 09:12:01

标签: google-chrome dalekjs mithril.js

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

.type()进来之前一切正常。

如果.type() input中的某个内容具有双向绑定m.propm.withAttr,然后assert该字段的值,则会产生行为。相反"test title"我得到"tsttle"。似乎测试运行得太快,Mithril无法捕获更改并将它们渲染回DOM。

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

是否有任何解决方法,我可以减慢类型流程吗?

P.S。我使用 Chrome 浏览器作为测试运行者。

3 个答案:

答案 0 :(得分:2)

这肯定是一个有趣的问题,但问题是,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();
  }
};

答案 1 :(得分:1)

秘密,当我写这篇文章时,会对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。

答案 2 :(得分:0)

Mithril异步渲染以响应事件处理程序(基本上这样,相关的事件组如keypress / input都有机会在重绘之前运行)

你可以尝试一些事情:

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

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

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