Сроки приемочного теста Ember-cli истекли при ожидании click(); ошибка qunit: Uncaught (в обещании) Ошибка: pushFailure()

Я пытаюсь создать приемочный тест для страницы входа в веб-приложение. Все почти работает, за исключением того, что обещание 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.


person ChrisN    schedule 21.06.2019    source источник
comment
Также, когда я просматриваю тесты в Chrome, все работает. Использую ли я await click(btnSubmit) или просто click(btnSubmit). Я вижу, что Chrome переходит на ожидаемую страницу после успешного входа в систему.   -  person ChrisN    schedule 21.06.2019
comment
какую версию эмбера ты используешь? Кроме того, вы где-нибудь используете ember concurrency? веб-сокеты? любые while(true)? как вы издевались над конечной точкой аутентификации? (я вижу, вы используете мираж). Вы можете добавить больше кода или минимальное воспроизведение? Спасибо! :)   -  person NullVoxPopuli    schedule 23.06.2019
comment
Кроме того, есть ли у вас какие-либо ошибки в консоли, когда происходит тестовый щелчок? я подозреваю, что есть запрос, который не завершается или не захвачен миражом. (pendingRequestCount: 1)   -  person NullVoxPopuli    schedule 23.06.2019
comment
Эмбер 3.10. ember-concurrency используется, но не в процессе входа в систему. Никаких веб-сокетов, никаких операторов while() в логине.   -  person ChrisN    schedule 24.06.2019
comment
Никакие ошибки не регистрируются, когда происходит событие click(). Однако выполнение кода останавливается, потому что больше не происходит console.log(). ДО события click() функция getSettledState() возвращает: hasPendingRequests: 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
comment
Эй, что вы имеете в виду под запросом, который не завершается или не захватывается миражом? Как Mirage перехватывает запрос? Так же, как он обычно перехватывает вызов API и отвечает на него локально? Я думаю, что все в API находится в мираже.   -  person ChrisN    schedule 24.06.2019


Ответы (1)


NullVoxPopuli был прав на 100%. Я разобрался с вашими подозрениями и обнаружил, что в кодовой базе была нерешенная задача ember-concurrency, о которой я не знал.

person ChrisN    schedule 23.06.2019