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