我有个问题
我想测试按钮单击后是否使用浓缩咖啡启动了网络浏览器。问题是:甚至有可能测试这样的东西吗?如果有任何想法我会怎么做?
我有个问题
我想测试按钮单击后是否使用浓缩咖啡启动了网络浏览器。问题是:甚至有可能测试这样的东西吗?如果有任何想法我会怎么做?
虽然这是一个老问题,但只是在这里发布以帮助其他人。我有同样的情况,我想验证一个特定的 url 是否在浏览器中启动。我从这个链接得到了真正的帮助
我使用这段代码让它工作:
Intents.init();
Matcher<Intent> expectedIntent = allOf(hasAction(Intent.ACTION_VIEW), hasData(EXPECTED_URL));
intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
onView(withId(R.id.someid)).perform(click());
intended(expectedIntent);
Intents.release();
因此,它会测试何时使用正确的 url 打开浏览器,并且intenting()通过启用意图存根来发挥作用。使用它,我们可以拦截它,因此意图永远不会发送到系统。
为方便起见,我建议一个完整的例子:
生产代码:
register_terms.text = Html.fromHtml(getString(R.string.register_terms,
getString(R.string.privacy_policy_url),
getString(R.string.register_terms_privacy_policy),
getString(R.string.general_terms_and_conditions_url),
getString(R.string.register_terms_general_terms_and_conditions)))
字符串 XML:
<string name="register_terms">By registering you accept our <a href=\"%1$s\">%2$s</a> and the <a href=\"%3$s\">%4$s</a>.</string>
<string name="register_terms_privacy_policy">Privacy Policy</string>
<string name="register_terms_general_terms_and_conditions">General Terms and Conditions</string>
<string name="privacy_policy_url" translatable="false">https://www.privacypolicy.com</string>
<string name="general_terms_and_conditions_url" translatable="false">https://www.generraltermsandconditions.com</string>
测试代码:
@Before
fun setUp() {
Intents.init()
}
@After
fun tearDown() {
Intents.release()
}
@Test
fun when_clickPrivacyLink_then_openPrivacyUrl() {
val expected = allOf(IntentMatchers.hasAction(Intent.ACTION_VIEW), IntentMatchers.hasData(string(privacy_policy_url)))
Intents.intending(expected).respondWith(Instrumentation.ActivityResult(0, null))
onView(ViewMatchers.withId(R.id.register_terms))
.perform(openLinkWithText(string(register_terms_privacy_policy)))
Intents.intended(expected)
}
其实没有。Espresso 将允许您单击按钮,一旦浏览器启动,测试将结束。您拥有的替代方法是让您的类触发浏览器 Intent 模拟,以便您可以测试剩余的流程(如果有)。
看看这个答案:控制自动化测试何时结束 - Espresso,我在其中描述了如何实现这一目标。