JavaScript 类:在构造函数和 get 方法中存储变量

JavaScript Classes: storing variables in constructor vs get methods

所以我正在使用页面对象模型模式和 Cypress(用 JavaScript 编写)开发自动化框架。

对于页面的某些部分,我正在制作页面组件(本质上是较小的页面对象)。为了减少维护,我想为 Web 元素存储 "locators" 以便于访问(以防它们发生变化)。

我将在 class 中进一步提到这些定位器的更大方法(组合多个元素并用它们做事)。但是我不确定存储它们的最佳方式。

我想到了两个选择(我不是 JavaScript 方面的专家,所以可能有更好的方法。总之有..

选项 1:(将它们存储在像这样的简单 GET 方法中):

saveButton() {
    return cy.contains('Save')
}

nameField() {
    return cy.get('.form-control[name="name"]')
}

descriptionField() {
    return cy.get('.form-control[name="description"]')
}

然后,当我需要访问定位器时,我只需在 class 更大的方法中进一步调用 nameField().type()saveButton().click() (尽管我想我需要在前面加上 this 在他们之前。

使用构造函数的另一个选项是这样的:

选项2:(使用构造函数)

class WidgetForm extends PageObject {
    constructor() {
        this.saveButton = 'Save'
        this.nameField = '.form-control[name="name"]'
        this.descriptionField = '.form-control[name="description"]'
    }
//...more code further down that uses these values

然后我可以用类似的方式引用它们,例如 cy.get(this.nameField).type() 尽管我想我也可以将整个 Cypress 命令函数存储在构造函数值中,例如:

this.nameField = cy.get('.form-control[name="name"]')(至少我假设)。

两者有什么特别的优势吗?我希望 JavaScript 允许像其他语言一样在 classes 中存储常量私有值(我知道它会出现在 ES7 中,但我想坚持现在有效的方法)。

显然欢迎任何其他建议。出于某种原因 Option 1 对我来说看起来更好。但是我不确定是不是slower/uglier定义了那么多函数。

选项 1 对我来说不错,组织更直观,我认为最终结果看起来更好。

Class WidgetForm {

    nameField() {
        return cy.get('.form-control[name="name"]')
    }

}

那么在你的测试中:

beforeEach(function () {
  WidgetForm.nameField().type({"Smith"})
})

不确定你的第二个建议是不是这个意思,但你可以使用 getter:

Class WidgetForm extends PageObject{
    constructor() {
        this.saveButton = 'Save'
        this.nameField = '.form-control[name="name"]'
        this.descriptionField = '.form-control[name="description"]'
    }
    get nameField() {
        return cy.get(this.nameField)
    }
}