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

时间:2017-12-06 12:58:46

标签: chai nightwatch.js

我用夜视仪进行集成测试。一些UI自动化,工作正常。最后,如果UI操作的结果是正确的,我想使用Rest API进行检查。我试着在那里使用柴,因为柴是建在夜班中。开箱即用的守夜人只支持expect.element(' #element')...,但我需要期望(真实).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:未处理的承诺   rejection(拒绝id:1):AssertionError:预期3等于2

不知何故有用但不好看。如果测试成功,则没有输出。

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

2 个答案:

答案 0 :(得分:1)

我同意,如果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]函数。如果将该断言置于测试函数中,则应该开始在控制台中看到输出。

答案 1 :(得分:0)

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

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