1

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

一切顺利,直到.type()进来。

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

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

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

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

4

3 回答 3

2

这绝对是一个有趣的问题,但问题是,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')

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

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();
  }
};
于 2014-08-12T22:26:34.957 回答
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。

于 2014-08-08T16:12:31.700 回答
0

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

你可以尝试几件事:

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

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

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

于 2014-08-08T23:10:43.887 回答