我正在尝试为Webapp的登录页面创建验收测试。除了await click(element)
承诺永远无法解决以外,一切工作几乎都在进行:
import { module, test } from 'qunit';
import { visit, currentURL, fillIn, click, waitFor, getSettledState } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import { invalidateSession } from 'ember-simple-auth/test-support';
import { setupMirage } from 'ember-cli-mirage/test-support';
module('Acceptance | login', function(hooks) {
setupApplicationTest(hooks);
setupMirage(hooks);
test('login page | login success', async function(assert) {
assert.timeout(5000);
console.log('start', getSettledState());
await visit('/login');
assert.equal(currentURL(), '/login');
await waitFor('.btn-primary:disabled');
await fillIn('input[type="text"]', 'mirage');
await fillIn('input[type="password"]', 'password1234');
await waitFor('.btn-primary:not([disabled])', 2000);
console.log('btn enabled');
let btnSubmit = document.querySelector('.btn-primary');
assert.equal(btnSubmit.disabled, false);
await click(btnSubmit);
console.log('await btn click');
await waitFor('.nav-tabs', 4000);
console.log('nav complete');
assert.equal(currentURL(), '/login-success');
console.log('finished', getSettledState());
});
});
如果我按原样运行此测试,则直到超时,“ await btn click”才登录控制台。我还收到qunit错误“ “未捕获(承诺),错误:测试上下文外部的pushFailure()断言,在____时位于internalStart处” (我加了下划线)
但是,如果我删除了await
调用的click(btnSubmit)
部分,则测试成功完成,但是getSettledState()的最后检查返回以下内容:
hasPendingRequests: true
hasPendingTimers: true
hasPendingWaiters: false
hasRunLoop: true
pendingRequestCount: 1
由于存在待处理的请求和计时器,即使所有assert()
调用均成功,测试仍然超时。
因此,如果使用await click(btnSubmit)
正确运行测试 ,则该测试在click()上超时,但是如果我只是调用click(btnSubmit)
,则该测试成功完成,尽管testem或qunit并不知道所有测试都已完成。我在做什么错了?
镜像登录端点:
this.post('/login', function(db, request) {
let formData = JSON.parse(request.requestBody);
let auth = this.serialize(db.profiles.all());
if (formData.identification !== auth.data[0].attributes.loginid || formData.password !== auth.data[0].attributes.password) {
return new Response(401, {some: 'header', 'Content-Type': 'application/json'}, {
error_code: "err_loginAuthenticationFail"
});
}
let profile = this.serialize(db.profiles.all());
profile.data[0].attributes.id = profile.data[0].attributes.localid
delete profile.data[0].attributes.localid;
return { ...longAccessTokenObject }
});
海市rage楼端点正常运行,它可以对我设置的一个用户/密码组合进行身份验证,无论是在测试中还是使用Chrome中的/ login页面手动进行。
答案 0 :(得分:3)
NullVoxPopuli是100%正确的。我跟进了您的怀疑,在代码库中有一个余烬并发任务,我不知道那是无法解决的。