用户交互
你的代码可以对任何组件调用 setValue 或 setEnabled,但用户不行。用户会在看得见的字段中输入内容,并点击已启用的按钮。TestBed 测试则通过 UserInteraction,以用户的方式执行操作。它的每个动词都会检查用户是否能够做出该操作,然后执行操作,并让组件像用户在浏览器中操作时那样,将操作报告给监听器。
每个动词都会在测试运行下一行之前完成,因此测试会在操作后立即检查结果。
像用户一样操作
下面的表单用于订阅邮件。只有在字段中输入了邮件地址后,Subscribe 按钮才会启用:
NewsletterForm.java
import com.webforj.component.Composite;
import com.webforj.component.button.Button;
import com.webforj.component.field.TextField;
import com.webforj.component.html.elements.Div;
import com.webforj.component.html.elements.Paragraph;
public class NewsletterForm extends Composite<Div> {
public NewsletterForm() {
TextField email = new TextField("Email");
Paragraph status = new Paragraph();
Button subscribe =
new Button(
"Subscribe", e -> status.setText("Subscribed " + email.getValue()));
subscribe.setEnabled(false);
email.onModify(e -> subscribe.setEnabled(!email.getValue().isBlank()));
getBoundComponent().add(email, subscribe, status);
}
}
测试输入邮件地址并点击 Subscribe,模拟用户做出的两个操作:
NewsletterFormTest.java
@Test
void shouldSubscribeTheEmailTheUserTyped(WebforjTestbed context) {
context.add(new NewsletterForm());
var email = ComponentLocator.of(TextField.class).byLabel("Email").locate();
var subscribe = ComponentLocator.of(Button.class)
.byText("Subscribe")
.locate();
UserInteraction.type(email, "ada@example.com");
UserInteraction.click(subscribe);
assertTrue(
ComponentLocator.of(Paragraph.class)
.byText("Subscribed ada@example.com")
.isPresent());
}
输入操作会将更改报告给字段的修改监听器,监听器随即启用按钮。随后发生的点击会传递给按钮的监听器,显示确认信息。
动词
UserInteraction 为许多组件共有的每种操作提供了一个动词:
click和doubleClick按下组件,或组件中的某个项目,例如表格中的一行或树中的一个节点。type替换字段中的文本,keypress在字段中按下按键,focus将焦点移到组件上。check和uncheck设置复选框、单选按钮或开关。select、selectIndex、selectKey和deselect更改列表、表格、树和选项卡面板中的选中项。open、close和cancel打开或关闭面板、对话框、抽屉和下拉菜单,并取消登录或上传操作。
动词会按与用户操作相同的顺序报告操作。例如,选择一个选项卡时,会先报告上一个选项卡失去选中状态,再报告新选项卡被选中。操作的鼠标按键、位置和修饰键通过 MouseOptions 和 KeyOptions 传入,它们是 click、doubleClick 和 keypress 的最后一个参数。
UserInteraction 参考列出了响应每个动词的组件。