我如何测试现场验证?

How can I test field validation?

我有验证码,它在不满足要求时设置 EditText 的错误。

field.setError(errorMessage);

这会在字段上方放置一个带有感叹号的红色小圆圈,当我触摸该字段时,它会在黑框中显示我的错误消息。太棒了!

现在我要 calabash 验证该字段是否未通过验证。目前至少我不关心具体的错误消息——我只想知道显示了一条错误消息(或者我很乐意接受感叹号,但因为我无法使用查询找到它在控制台中,我怀疑这会更难)。

这个查询:

query("android.widget.PopupWindow$PopupViewContainer")

查找错误消息 window(如果存在)。

但它仅在出现错误的字段具有焦点时才会出现。而且我只在字段 失去 焦点时设置错误。那应该没问题——我的步骤可以在字段中输入文本,离开字段,然后返回。当我手动执行这些操作时,会显示错误消息 window。我还不能做的是编写一个步骤来执行这些操作并可靠地显示错误消息 window。我试过了

query("EditText id:'#{field_id}'", {:setText => bad_text})
touch(query("* id:'#{another_field_id}'")[0])
touch(query("* id:'#{field_id}'")[0])

query("EditText id:'#{field_id}'", {:setText => bad_text})
system("#{default_device.adb_command} shell input keyevent KEYCODE_TAB")
touch(query("* id:'#{field_id}'")[0])

并且这两个对于第一个 EditText 的行为都是正确的,但是对于后续的 EditText 则无法显示错误消息 window。为什么?正确的做法是什么?

您的 calabash 命令有多种情况可能会导致您的测试失败。

1) 不要使用 touch(query(...

# bad
touch(query("q"))
# good
touch("q")

2) 不要使用'setText'模拟输入文字

# bad
query("EditText", {:setText => 'bad_text'})
# good
enter_text("EditText", 'bad_text')

3) 不使用任何输入事件

用户不可能在大多数设备上执行 system("#{default_device.adb_command} shell input keyevent KEYCODE_TAB") 这样的输入事件,因为很少有 Android 设备具有物理键盘。使用press_user_action_button模拟用户按下出现的输入键而不是回车键。