gpt4 book ai didi

ember.js - 稍后测试: how to assert between two sequential promises/run.?如何跳过测试中的 `run.later`等待?

转载 作者:行者123 更新时间:2023-12-03 06:23:42 25 4
gpt4 key购买 nike

这是一个简单的组件:

App.FooBarComponent = Ember.Component.extend({   
tagName: "button",
status: "Ready",
revertStatusPeriodMs: 2000,

click: function() {
this.set('status', 'Pending');

// A fake ajax
this.run()
.then( function() {
this.updateStatus('Finished');
}.bind(this))
.catch( function() {
this.updateStatus('Error');
}.bind(this));
},

run: function() {
return new Ember.RSVP.Promise( function(resolve) {
Ember.run.later( function() {
resolve();
}, 500);
});
},

updateStatus: function(statusText) {
this.set('status', statusText);

var periodMs = this.get('revertStatusPeriodMs') || 1000;

Ember.run.later( function() {
this.set('status', 'Ready');
}.bind(this), periodMs);
}
});

它做了一件简单的事情:单击时,它会显示一些文本。稍后用另一文本替换该文本。即使稍后,它也会将文本恢复为初始文本。

代码运行良好。我的问题是我无法为其编写测试。

test('clicking the button should set the label', function(assert) {
expect(4);

visit('/');

assert.equal( find('button').text().trim(), 'Ready', 'Should initially be "Ready"');

andThen(function() {
click('button');
assert.equal( find('button').text().trim(), 'Pending', 'Should "Pending" right after click');
});

// This one fires too late!
andThen(function() {
assert.equal( find('button').text().trim(), 'Finished', 'Should become "Finished" after promise fulfills');
});

andThen(function() {
assert.equal( find('button').text().trim(), 'Ready', 'Should eventually return to the "Ready" state');
});
});

我有两个问题:

  1. 我无法测试已完成状态。似乎 andThen 等待所有的 Promise 和 run.later 完成,而我想测试中间状态。如何在两个连续的 Promise/run.later 之间运行断言?

  2. 时间可能很长,测试可能需要很长时间才能完成。我通常不介意重构代码以获得更好的可测试性,但我拒绝根据环境调整应用程序中的时间(例如,2000 用于开发/生产,0 用于测试)。相反,我想使用计时器模拟或其他一些解决方案。

    我尝试过Sinon,但失败了:当我模拟计时器时,andThen永远不会返回。 these 都不是解决方案帮助了我。

JSBin:http://emberjs.jsbin.com/fohava/2/edit?html,js,output (包括诗乃)

最佳答案

你的测试代码似乎都没有使用异步 - 这似乎是至关重要的,因为没有任何东西来区分它们,最后两个测试将在同一个tick中执行(测试3和4可以'两者同时为真)。我对 QUnit 不熟悉,但我确实发现它是 async method ,这似乎是相关的。然而,当我尝试调用assert.async时,它崩溃了。我尝试更新 QUnit 1.17,仍然没有骰子。

所以我没有办法给你。但问题是,一旦所有异步执行完成,Ember 只会执行 andThen 测试 - 这意味着测试 3 永远不会成立。

关于ember.js - 稍后测试: how to assert between two sequential promises/run.?如何跳过测试中的 `run.later`等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28782076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com