基本问题 Serenity/JS?
Base questions with Serenity/JS?
我刚刚开始考虑切换到 Serenity/JS,想知道使用基数 Questions/Tasks 是否是最佳做法?
很多时候我会想检查一个字段是否为空或有错误,所以我创建了一个'base Question'来实现这个:
基本问题
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'))
)
}
然后我创建 class特定于场景的问题,但只是扩展基本问题:
import { LoginForm } from '../scenery/login_form';
import { InputFieldQuestion } from './common';
class CheckIfTheUsernameFieldQuestion extends InputFieldQuestion {
constructor() { super(LoginForm.Username_Field) }
}
export let CheckIfTheUsernameField = new CheckIfTheUsernameFieldQuestion();
节点导出的优点让我可以导出实例化问题 class 以用于我的规范。
我只是想知道我是否在滥用 Serenity/JS 框架,或者这是否可以?我想建立一个良好的框架,并希望确保我所做的一切都符合最佳实践。感谢任何反馈!
当然,你可以这样做,尽管我个人更喜欢组合而不是继承。
据我所知,您正在设计标准化的验证任务,您希望按如下方式使用:
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()
);
希望对您有所帮助!
一月
我刚刚开始考虑切换到 Serenity/JS,想知道使用基数 Questions/Tasks 是否是最佳做法?
很多时候我会想检查一个字段是否为空或有错误,所以我创建了一个'base Question'来实现这个:
基本问题
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'))
)
}
然后我创建 class特定于场景的问题,但只是扩展基本问题:
import { LoginForm } from '../scenery/login_form';
import { InputFieldQuestion } from './common';
class CheckIfTheUsernameFieldQuestion extends InputFieldQuestion {
constructor() { super(LoginForm.Username_Field) }
}
export let CheckIfTheUsernameField = new CheckIfTheUsernameFieldQuestion();
节点导出的优点让我可以导出实例化问题 class 以用于我的规范。
我只是想知道我是否在滥用 Serenity/JS 框架,或者这是否可以?我想建立一个良好的框架,并希望确保我所做的一切都符合最佳实践。感谢任何反馈!
当然,你可以这样做,尽管我个人更喜欢组合而不是继承。
据我所知,您正在设计标准化的验证任务,您希望按如下方式使用:
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()
);
希望对您有所帮助!
一月