Ember-cli接受测试在等待click()时超时; qunit错误:未捕获(承诺)错误:pushFailure()

时间:2019-06-21 20:34:32

标签: javascript ember.js ember-cli qunit testem

我正在尝试为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页面手动进行。

1 个答案:

答案 0 :(得分:3)

NullVoxPopuli是100%正确的。我跟进了您的怀疑,在代码库中有一个余烬并发任务,我不知道那是无法解决的。