在其中一个应用程序页面上,我们有一个按钮栏,其中包含一组不同的按钮,这些按钮根据屏幕中的不同操作更改其“启用”。
因此,相应的UI测试具有非常相似的期望检查,例如:
it("action 1", function () {
// some actions
expect(pageObject.batch.applyButton.isEnabled()).toEqual(true);
expect(pageObject.batch.resetButton.isEnabled()).toEqual(true);
expect(pageObject.batch.refreshQueueButton.isEnabled()).toEqual(true);
expect(pageObject.batch.dismissButton.isEnabled()).toEqual(true);
});
it("action 2", function () {
// some actions
expect(pageObject.batch.applyButton.isEnabled()).toEqual(false);
expect(pageObject.batch.resetButton.isEnabled()).toEqual(true);
expect(pageObject.batch.refreshQueueButton.isEnabled()).toEqual(false);
expect(pageObject.batch.dismissButton.isEnabled()).toEqual(true);
});
it("action 3", function () {
// some actions
expect(pageObject.batch.applyButton.isEnabled()).toEqual(false);
expect(pageObject.batch.resetButton.isEnabled()).toEqual(false);
expect(pageObject.batch.refreshQueueButton.isEnabled()).toEqual(true);
expect(pageObject.batch.dismissButton.isEnabled()).toEqual(true);
});
这看起来不太好,违反了DRY principle。
您将如何重构它并以更易读的方式应用多个期望检查?
我正在考虑让一个Page Object函数负责报告按钮的状态,这些按钮会返回一个声明,该声明将解析为在测试中实际声明的布尔数组:
expect(pageObject.batch.getButtonState()).toEqual([true, true, false, false]);
它“提取方法”并有助于缩短测试时间,但它使调试更难以减少断言错误信息。例如。 [true, false, true, false] is not equal to [true, true, false, false]
并不意味着什么,需要进行单独的调查,这可能非常耗时。
答案 0 :(得分:2)
<强> custom_matcher 强>
项目通常希望封装自定义匹配代码以跨多个规范使用。以下是如何创建与Jasmine兼容的自定义匹配器。
// Custom matchers
var matchers = {
toBeEnabled: { ..
// Register matchers
jasmine.addMatchers(matchers)
it(..
expect([ .. ]).toBeEnabled() // pass if ALL enabled
expect([ .. ]).not.toBeEnabled() // pass if ALL disabled
答案 1 :(得分:1)
我个人更喜欢user943702的答案,但是如果你想保持布尔数组的外观,你也可以使用:
expect(pageObject.batch).toHaveStates([true, true, false, false]);
让toHaveStates匹配器迭代两个数组并按顺序比较批处理中的每个项目。