如何在 nightwatch.js 测试中使用 chai 的 expect

How to use chai's expect in nightwatch.js tests

我用 nightwatch 做集成测试。一些 UI 自动化,效果很好。最后我想使用 Rest API 检查 UI 操作的结果是否正确。我尝试在那里使用 chai,因为 chai 内置于 nightwatch 中。开箱即用的 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();
        });
    }
};

如果期望失败,输出为

(node:3594) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected 3 to equal 2

有点用但不是很好。如果测试成功则没有输出。

如何让 nightwatch.js 打印结果,或以任何其他方式输出更标准的测试结果?

我目前的解决方案是将 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();
        });
    }
};

这看起来并不完美,但输出还不错。

我同意,如果 expect 断言不仅仅用于元素,那就太好了。我为此使用的解决方法是 browser.verify.ok() 然后我只添加一条消息来描述测试实际在做什么,这样当我查看结果时我可以看到它是什么测试。在您的情况下,它将是这样的:

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

在控制台中,您将看到如下消息:

Passed [ok]: there are 2 rules

尽管如此,我认为上述方法根本无法解决您的承诺拒绝问题。您可以在 then 之后放置一个 catch,这将解决未处理的承诺拒绝的问题。这是处理被拒绝承诺的正确方法。

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] 函数中工作。如果将该断言放入测试函数中,您应该开始在控制台中看到输出。