【问题标题】:How to use chai's expect in nightwatch.js tests如何在 nightwatch.js 测试中使用 chai 的期望
【发布时间】:2017-12-06 12:58:46
【问题描述】:

我使用 nightwatch 进行集成测试。一些 UI 自动化,效果很好。最后,我想使用 Rest API 检查 UI 操作的结果是否正确。我尝试在那里使用 chai,因为 chai 内置在守夜人中。开箱即用的 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: 未处理的承诺 拒绝(拒绝 id:1):AssertionError:预期 3 等于 2

在某种程度上有用但不是很好。如果测试成功则没有输出。

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

【问题讨论】:

  • 你应该返回承诺:return fetchRulesFromJira({ browser, username, password }).then(....);
  • 不幸的是,它没有这样做。

标签: chai nightwatch.js


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2015-05-10
      • 2019-02-15
      • 2019-09-01
      • 1970-01-01
      相关资源
      最近更新 更多