我的一项测试是在运行整个套件时间歇性地失败,但在单独运行时它并没有失败。
我创建了一个非常基本的存储库,其中包含一个可以重现问题的vanilla应用程序: https://github.com/juanazam/ember-cli-test-issue
基本上,我创建了一个带有文本字段和按钮的组件。文本为空时,该按钮被禁用。
当两个测试在输入上使用fillIn助手时会出现问题。
以下是从vanilla应用程序中获取的测试代码:
test('test 1', function(assert) {
visit('/');
fillIn('input[type=text]', "Algo");
andThen(function() {
assert.equal(currentRouteName(), "index");
});
});
test('test 2', function(assert) {
visit('/');
andThen(function() {
assert.ok(find('input[type=submit]').is(':disabled'));
});
fillIn('input[type=text]', "Algo");
andThen(function() {
assert.ok(!find('input[type=submit]').is(':disabled'));
});
});
正如您所看到的,测试1仅填充输入但不对其执行任何操作。第二个测试测试按钮是否被禁用。
测试2在运行整个套件时间歇性地失败。如果你运行ember test -s它会失败,如果你重新加载浏览器选项卡(重新运行整个套件而不重新启动服务器进程)它会通过。多次运行会发生相同的行为(一次运行失败,下一次运行成功)。
我没有创建旋转复制案例,因为测试运行器的行为方式不同。
答案 0 :(得分:0)
随着你的应用程序:
ember test
将永远失败。
ember test --filter 'test 1'
将永远通过。
ember test --filter 'test 2'
将始终传递。
如果将2个测试功能分成不同的验收测试,ember test
将始终通过。
答案 1 :(得分:0)
浏览器中的Qunit首先尝试执行失败的测试。 (我想减少执行最有趣的失败测试的时间。)使用ember -s,您的测试总是按顺序执行,测试失败(我猜测试2失败,因为test1已经填满了您的输入,并且最初没有按预期禁用)。
在第一次测试失败后在浏览器中重新加载qunit时,首先执行失败的test2(然后通过)。
另请查看https://dockyard.com/blog/2014/04/17/ember-object-self-troll。组件定义中可能存在问题,导致test2中意外填充的输入。