Я пытаюсь создать приемочный тест для страницы входа в веб-приложение. Все почти работает, за исключением того, что обещание 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());
});
});
Если я запускаю этот тест как есть, «ожидание нажатия кнопки» не регистрируется в консоли до тех пор, пока не истечет время ожидания. Я также получаю ошибку qunit "Uncaught (in promise) Error: утверждение pushFailure() вне тестового контекста, в ___ at internalStart" (подчеркивание добавлено мной)
ОДНАКО, если я удалю часть await
вызова click(btnSubmit)
, тест завершится успешно, НО последняя проверка getSettledState() вернет это:
hasPendingRequests: true
hasPendingTimers: true
hasPendingWaiters: false
hasRunLoop: true
pendingRequestCount: 1
Поскольку есть ожидающие запросы и таймеры, время ожидания теста все равно истекло, хотя все вызовы assert()
были успешными.
Таким образом, похоже, что если я запускаю тест правильно с помощью await click(btnSubmit)
, время теста истекает при нажатии(), но если я просто вызываю click(btnSubmit)
, тесты завершаются успешно, хотя testem или qunit не < em>узнать все пройденные тесты. Что я делаю неправильно?
конечная точка входа в Mirage:
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 }
});
Конечная точка Mirage работает правильно, она аутентифицирует одну комбинацию user/pw, которую я установил, будь то в тестах или вручную, используя страницу /login в Chrome.
click(btnSubmit)
или простоclick(btnSubmit)
. Я вижу, что Chrome переходит на ожидаемую страницу после успешного входа в систему. - person ChrisN   schedule 21.06.2019while(true)
? как вы издевались над конечной точкой аутентификации? (я вижу, вы используете мираж). Вы можете добавить больше кода или минимальное воспроизведение? Спасибо! :) - person NullVoxPopuli   schedule 23.06.2019pendingRequestCount: 1
) - person NullVoxPopuli   schedule 23.06.2019hasPendingRequests: false hasPendingTimers: true hasPendingWaiters: false hasRunLoop: true pendingRequestCount: 0
ПОСЛЕ нажатия кнопки() происходит большая задержка, затем функция getSettledState() возвращает:hasPendingRequests: false hasPendingTimers: true hasPendingWaiters: false hasRunLoop: true pendingRequestCount: 0
Кроме того, другие вызовы click(someBtn) отлично работают в других приемочных тестах. - person ChrisN   schedule 24.06.2019