处理多个类似的期望

时间:2016-09-19 18:36:23

标签: javascript testing jasmine promise protractor

在其中一个应用程序页面上,我们有一个按钮栏,其中包含一组不同的按钮,这些按钮根据屏幕中的不同操作更改其“启用”

因此,相应的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]并不意味着什么,需要进行单独的调查,这可能非常耗时。

2 个答案:

答案 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匹配器迭代两个数组并按顺序比较批处理中的每个项目。