testability.whenStable () возвращает, testability.isStable () возвращает false - PullRequest
0 голосов
/ 04 февраля 2019

Обратите внимание, что это не относится к транспортиру.Проблема связана со встроенной в Angular 2 службой тестирования , которую использует Protractor.Транспортир вызывает Testability.whenStable через вызов waitForAngular.Я столкнулся с кодом, где это не удается.

Мой тестовый код выглядит примерно так:

await renderFooView();
await interactWithFooView();

Вторые строки не выполняются:

 Failed: No element found using locator: By(css selector, foo-view)

Угловой незакончил рендеринг 'foo-view', когда Protractor продолжает с кодом, который пытается взаимодействовать с ним.

Если я добавляю промежуточный сон, он работает:

await renderFooView();
await browser.sleep(1000);
await interactWithFooView();

Очевидно, я нехочу сделать это.Большую ценность Protractor для меня представляет механизм «ожидания углового», который устраняет шум «ожидания Х» в моих сценариях.Я хочу вот что:

await renderFooView();
await browser.waitForAngular();
await interactWithFooView();

И на самом деле, мне никогда не придется вручную выполнять эту среднюю строку.Protractor делает это автоматически каждый раз, когда я звоню, который взаимодействует с браузером.

После некоторых копаний я обнаружил, что Protractor делает вызов, он работает правильно, нолежащий в основе механизм тестируемости в Angular 2 выглядит неработоспособным.

В Angular 2 «WaitForAngular» транспортира делает что-то вроде следующего:

let rootElement = window.getAllAngularRootElements()[0];
let testability = window.getAngularTestability(rootElement);
testability.whenStable(callbackThatResumesScriptExecution);

Другими словами, он вызывает Angular testability.whenStable и тольковозобновляет выполнение, когда Angular сообщает, что он стабилен.Если я добавлю некоторую регистрацию в обратном вызове:

testability.whenStable(() => {
    console.log("isStable:", testability.isStable());
    callback();
});

isStable() всегда истинно внутри обратного вызова whenStable, поэтому Angular определенно вызывает то, что кажется правильнымвремя.

Однако, если сразу после этого обратного вызова я снова набираю isStable(), он оценивается как ложное.

    let pollAngularIsStable = `{ 
        let rootElement = window.getAllAngularRootElements()[0];
        let testability = window.getAngularTestability(rootElement);
        return testability.isStable();
    }`;

    await renderFooView();
    await browser.waitForAngular();
    console.log(await browser.executeScript(pollAngularIsStable)); // => false
    await interactWithFooView();

Я написал свою собственную версию browser.waitForAngular,и я вижу точно такие же результаты:

    let waitForAngularStable = `
        let callback = arguments[arguments.length - 1];
        let rootElement = window.getAllAngularRootElements()[0];
        let testability = window.getAngularTestability(rootElement);
        testability.whenStable(callback);
    `;
    await renderFooView();
    await browser.executeAsyncScript(waitForAngularStable);
    console.log(await browser.executeScript(pollAngularIsStable)); // => false
    await interactWithFooView();

Если я напишу подпрограмму, которая вручную опрашивает isStable(), пока она не вернет true, это исправляет мой сценарий:

    async function waitForAngular() {
        let ms;
        for (ms=0; ms<10000; ++ms) {
            await browser.sleep(1);
            if (await browser.executeScript(pollAngularIsStable)) {
                break;
            }
        }
        console.log(`Waited ${ms}ms for Angular to be stable.`);
    }

    await renderFooView();
    await waitForAngular(); // usually waits < 50ms
    console.log(await browser.executeScript(pollAngularIsStable)); // => true
    await interactWithFooView(); // always works now

Итак ..Почему опрос isStable() работает, но ожидание обратного вызова whenStable() не работает?Что еще более важно, почему whenStable() сообщает, что приложение стабильно, когда уже при следующем вызове (без промежуточного кода) показывается, что isStable() ложно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...