Как использовать ожидания chai в тестах nightwatch.js

Я делаю интеграционные тесты с nightwatch. Некоторая автоматизация пользовательского интерфейса, которая отлично работает. В конце я хочу проверить с помощью Rest API, верны ли результаты операций пользовательского интерфейса. Я стараюсь использовать там чай, так как чай встроен в ночной дозор. Из коробки nightwatch поддерживает только expect.element('#element')..., но мне нужен стиль expect(true).to.be.true.

Это (часть) моего тестового файла:

const { expect } = require('chai');

module.exports = {
    'Add Rules (Tester 1)' : browser => {
         ... some tests
    }
    after: browser => {
        let username = 'username';
        let password = 'xxxxxxxx';

        fetchRulesFromJira({ browser, username, password }).then(rules => {
            expect(rules.length).to.equal(2);
            browser.end();
        });
    }
};

Если ожидание не удается, вывод

(узел: 3594) UnhandledPromiseRejectionWarning: отклонение необработанного обещания (идентификатор отклонения: 1): AssertionError: ожидается, что 3 будет равно 2

Как-то полезно, но не приятно. Если тест проходит успешно, то вывода нет.

Как я могу заставить nightwatch.js печатать результаты или любым другим способом получить более стандартный вывод результатов теста?


person Michael    schedule 06.12.2017    source источник
comment
Вы должны вернуть обещание: return fetchRulesFromJira({ browser, username, password }).then(....);   -  person Troopers    schedule 06.12.2017
comment
К сожалению, это не так.   -  person Michael    schedule 06.12.2017


Ответы (2)


Я согласен, было бы неплохо, если бы утверждения expect можно было использовать не только для элементов. Обходной путь, который я использую для этого, — это browser.verify.ok(), а затем я просто добавляю сообщение, описывающее, что на самом деле делает тест, чтобы, когда я смотрю на результаты, я мог видеть, что это был за тест. В вашем случае это будет примерно так:

browser.verify.ok(rules.length === 2, 'there are 2 rules');

В консоли вы увидите такое сообщение:

Passed [ok]: there are 2 rules

Хотя я не думаю, что описанный выше подход вообще справится с проблемой отклонения вашего обещания. Вы можете просто поставить catch после then, и это решит вашу проблему с отклонением необработанного обещания. Это правильный способ обработки отклоненных обещаний.

fetchRulesFromJira({ browser, username, password }).then(rules => {
        expect(rules.length).to.equal(2);
        browser.end();
    })
    .catch(err => {
       browser.assert.fail(err);
    });

Кроме того, еще раз взглянув на ваш код, я хочу упомянуть еще одну вещь. Вы пытаетесь сделать утверждение в методе after. Это будет запущено после завершения всех тестов. Обычно вы используете функцию after для какой-либо очистки или демонтажа. Я все еще новичок в ночных наблюдениях, но я не думаю, что лучше всего помещать туда утверждения. Кроме того, я не совсем уверен, что они вообще работают в функциях before[Each] или after[Each]. Если вы поместите это утверждение в тестовую функцию, вы должны начать видеть вывод в консоли.

person tehbeardedone    schedule 13.12.2017

Мое текущее решение состоит в том, чтобы инкапсулировать expect в try/catch и вызывать ошибку с помощью nightwatch.

const { expect } = require('chai');

module.exports = {
    'Add Rules (Tester 1)' : browser => {
         ... some tests
    }
    after: browser => {
        let username = 'username';
        let password = 'xxxxxxxx';

        fetchRulesFromJira({ browser, username, password }).then(rules => {
            try {
                expect(rules.length).to.equal(2);
            } catch(error) {
                browser.assert.fail(error);
            }

            browser.end();
        });
    }
};

Это не выглядит идеально, но выход вполне в порядке.

person Michael    schedule 06.12.2017