处理多个类似的期望

Handling multiple similar expectations

本文关键字:期望 处理      更新时间:2023-09-26

在其中一个应用程序页面上,我们有一个带有一组不同按钮的按钮栏,这些按钮根据屏幕上的不同操作改变它们的"启用状态"

因此,相应的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原则。

你将如何重构它并以一种更可读的方式应用多个期望检查?


我想有一个页面对象函数负责报告按钮的状态,该按钮将返回一个承诺,解析为一个布尔值数组,实际上将在测试中断言:

expect(pageObject.batch.getButtonState()).toEqual([true, true, false, false]);

它"提取方法"并有助于使测试更短,但它使调试更难减少断言错误信息。例如,[true, false, true, false] is not equal to [true, true, false, false]意义不大,需要单独调查,这可能很耗时。

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

我个人更喜欢user943702的答案,但是如果您想保持布尔值数组的外观,您也可以使用:

expect(pageObject.batch).toHaveStates([true, true, false, false]);

让toHaveStates匹配器遍历两个数组,并按顺序比较批处理中的每个项。