JS: ошибка типа: класс расширяет значение не является конструктором или нулем

#javascript #class #object #oop #dependencies

#javascript #класс #объект #ооп #зависимости

Вопрос:

Я пишу тесты пользовательского интерфейса, используя шаблон PageObject (NodeJS Webdriverio), и у меня есть базовый класс (BasePage), класс страницы (MyPage), класс всплывающего компонента (PopupComponentClass) с многоцелевым поведением, класс всплывающего окна с конкретной реализацией (SpecificPopupComponentClass). Мне нужно расширить SpecificPopupComponentClass из PopupComponentClass .

page.js:

 export default class BasePage {


    get BASE_URL() {
        return "https://url.com";
    };

    ...some methods...
}
 

my.page.js:

 import BasePage from "../page";

class MyPage extends BasePage {

    constructor() {
        super();
    };

    get URL() { return `${this.BASE_URL}/some/path` };
    get title() { return $("h1") };

    orderRandomTariff() {
        ...some actions...
    };

}

export default new MyPage ();
 

popup.component.page.js:

 import BasePage from "../pages/page";

class PopupComponent extends BasePage{

    constructor() {
        super();
    };

    get title() { return $("h1") };
    

}

export default new PopupComponent();
 

specific.popup.component.js:

 import PopupComponent from "./popupFragment";

class SpecificPopupComponent extends PopupComponent {

    constructor() {
        super();
    };

    get popupStreetInput() { return $(".//div[@class='checkAddress']//*[./*[contains(text(),'Street')]]//input") };

    fillStreet(street) {
        ...some actions with this.popupStreetInput...
    };

}

export default new SpecificPopupComponent();
 

… и пытается использовать его в test.js:

 import MyPage from "../../../../pages/my.page";
import SpecificPopupComponent from "../../../../fragments/specific.popup.component";

const myPage= MyPage ;
const popup = SpecificPopupComponent ;

describe("Test", () => {

    before(() => {
        myPage.open();
    });

    it("Check", () => {
        popup.fillStreet("Street");
    });

});
 

но я получаю сообщение об ошибке: «Ошибка типа: класс расширяет vlaue #PopupComponent не является конструктором или null».
Я подозреваю, что это связано с циклическими зависимостями, но я не могу понять, что мне нужно сделать, чтобы это исправить.

Ответ №1:

Похоже, проблема здесь в том, как вы экспортируете базовый класс. Вы создаете его экземпляр вместо того, чтобы просто экспортировать класс, который вы унаследуете. Это должно быть так:

 export default class PopupComponent extends BasePage {

    constructor() {
        super();
    };

    get title() { return $("h1") };
    

}
 

А затем создайте экземпляр, когда вы собираетесь его использовать

 var myPage = new MyPage()
var popup = new SpecificPopupComponent()

myPage.open()
popup.fillStreet('street')
 

То, что вы там делаете, эквивалентно выполнению этого:

 class SpecificPopupComponent extends new PopupComponent() {
   // ... what am I? 🤔
}
 

Я подозреваю, что это связано с циклическими зависимостями

Вы можете проверить или отклонить своих подозреваемых, скопировав весь код в тестовый файл в правильном порядке без использования импорта. Но я не думаю, что это циклическая зависимость

Я создал этот плунжер, чтобы удалить использование импорта и доказать это.