Совместное использование утверждений внутри методов объекта страницы

Я пытаюсь создать метод в объекте страницы, который выполняет определенный тест, который я буду часто использовать. Я следил за пример документации, но он предназначен для ввода / нажатия и, возможно, не может работать с expect?

AssertionError: expected undefined to be truthy

Эта ошибка конкретно указывает на эту строку внутри моего теста:

await t.expect(await page.nameTextInput.isRequired()).ok()

Он вызывает isRequired проверку внутри «TextInputFeature», который я использовал в своей объектной модели страницы:

export default class TextInputFeature {
    constructor(model) {
        this.input = AngularJSSelector.byModel(model);
        this.label = this.input.parent().prevSibling('label');
        this.asterisk = this.label.find('.required');
    }

    async isRequired() {
        await t
            .expect(this.input.hasAttribute('required')).ok()
            .expect(this.asterisk.exists).ok();
    }
}

РЕДАКТИРОВАТЬ: Следующие "работы":

await t
      .expect(...)
      .click(...)
      .expect(...)
await page.racTextInput.isRequired();
await t
      .expect(...)

... но моя цель - разрешить цепочку:

await t
      .expect(...)
      .click(...)
      .expect(page.racTextInput.isRequired()).ok()
      .expect(...)

person helion3    schedule 01.03.2019    source источник


Ответы (1)


Я обнаружил в вашем коде несколько ошибок. Пожалуйста, проверь это. 1) Метод isRequired ничего не возвращает, поэтому у вас undefined. 2) Я думаю, вам не нужно оборачивать метод isRequired в отдельный вызов expect. Достаточно написать только await page.nameTextInput.isRequired() 3) Вы пропустили параметр t в методе isRequired, однако, думаю, это просто опечатка

ОБНОВЛЕНО:

Тестовая страница:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <label>Name
    <div class="required">*</div>
    </label>
    <input required="required" type="text" id="name">
</body>
</html>

Код теста:

import { Selector } from 'testcafe';

class TextInputFeature {
    constructor () {
        this.input    = Selector('input#name');
        this.label    = Selector('label');
        this.asterisk = this.label.find('.required');
    }

    async isRequired () {
        const hasRequiredAttribute = await this.input.hasAttribute('required');
        const asteriskExists       = await this.asterisk.exists;

        return hasRequiredAttribute && asteriskExists;
    }
}

fixture`fixture`
    .page`../pages/index.html`;

test(`test`, async t => {
    const inputFeature = new TextInputFeature();

    await t
        .click(inputFeature.label)
        .expect(await inputFeature.isRequired()).ok()
        .click(inputFeature.label);
});
person Alex Kamaev    schedule 01.03.2019
comment
Я следовал примеру, но видел тот же подход здесь. 1) Метод async использует await и не требует возврата, на самом деле eslint вызывает меня для этого 2) Я хочу, чтобы он был привязан, это моя цель. 3) t импортируется, а не передается в качестве аргумента согласно документации. - person helion3; 01.03.2019
comment
Я изменил свой ответ, чтобы продемонстрировать подход, который я бы порекомендовал - person Alex Kamaev; 04.03.2019