与Serenity / JS的基本问题?

时间:2017-10-23 09:39:09

标签: javascript typescript serenity-js

我刚刚开始考虑转向Serenity / JS并想知道是否有最佳实践来提供基础问题/任务?

有很多次我想检查一个字段是空白还是有错误,所以我创建了一个基本问题'实现这一目标:

基本问题

import { Is, See, Target, Task, Wait, Value, Attribute } from 'serenity-js/lib/screenplay-protractor';
import { equals, contains } from '../../../support/chai-wrapper';
import { blank } from '../../../data/blanks';

export class InputFieldQuestion {
    constructor(private inputField: Target) { }

    isBlank = () => Task.where(`{0} ensures the ${this.inputField} is blank`,
        Wait.until(this.inputField, Is.visible()),
        See.if(Value.of(this.inputField), equals(blank))
    )

    hasAnError = () => Task.where(`{0} ensures the ${this.inputField} has an error`,
        See.if(Attribute.of(this.inputField).called('class'), contains('ng-invalid'))
    )
}

然后我创建特定于场景的类,但只是扩展基本问题:

import { LoginForm } from '../scenery/login_form';
import { InputFieldQuestion } from './common';

class CheckIfTheUsernameFieldQuestion extends InputFieldQuestion {
    constructor() { super(LoginForm.Username_Field) }
}

export let CheckIfTheUsernameField = new CheckIfTheUsernameFieldQuestion();

节点导出之美允许我导出一个实例化的问题类,以便在我的规范中使用。

我只是想知道我是否滥用Serenity / JS框架或者这是否合适?我想建立一个好的框架,并希望确保我尽一切努力做到最好。任何反馈都表示赞赏!

1 个答案:

答案 0 :(得分:0)

当然,你可以这样做,虽然我个人赞成作文而不是继承。

据我所知,您正在设计标准化验证任务,您希望按如下方式使用:

actor.attemptsTo(
    CheckIfTheUsernameField.isBlank()
)

您可以通过稍微更灵活的设计来完成相同的结果,其中可以使用要检查的字段对任务进行参数化:

actor.attemptsTo(
    EnsureBlank(LoginForm.Username_Field)
)

其中:

const EnsureBlank = (field: Target) => Task.where(`#actor ensures that the ${field} is blank`,
    Wait.until(field, Is.visible()),
    See.if(Value.of(field), equals(blank)),
);

或者,按照您想要的DSL进行操作:

const EnsureThat = (field: Target) => ({
    isBlank: () => Task.where(`#actor ensures that the ${field} is empty`,
        Wait.until(field, Is.visible()),
        See.if(Value.of(field), equals(blank)),
    ),
    hasError: () => Task.where(`#actor ensures that the ${field} has an error`,
       See.if(Attribute.of(this.inputField).called('class'), contains('ng-invalid')),
    ),
});

可以使用如下:

actor.attemptsTo(
    EnsureThat(LoginForm.Username_Field).isBlank()
);

希望这有帮助!