意式浓缩咖啡与我的 ACTION_SEND 意图不符
Espresso intended is not matching my ACTION_SEND intent
我有一个 activity 的意图,我是这样创建的:
private fun startShareIntent() {
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "Watch ${viewmodel.movie.value?.title} with me!\n\n${viewmodel.movie.value?.summary}")
type="text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)
}
当我单击工具栏上的图标时,该功能是 运行。我想 运行 一杯 Espresso UI 对其进行测试,以检查 activity 启动是否确实符合上述意图。为此,我只是先检查意图是否真的是上述意图,如下所示:
@Test
fun test_clicking_share_icon_shows_sharing_sheet() {
val scenario = activityScenarioRule.scenario
Intents.init()
val expectedIntent = allOf(
hasAction(Intent.ACTION_SEND),
hasExtra(Intent.EXTRA_TEXT, "Watch ${dummyMovieData.title} with me!\n\n${dummyMovieData.summary}"),
hasType("text/plain")
)
onView(withText(dummyMovieData.title)).perform(click())
onView(withId(R.id.share_detail)).perform(click())
intended(expectedIntent)
Intents.release()
}
然而,这 returns 我 AssertionFailedError
:
junit.framework.AssertionFailedError: Wanted to match 1 intents. Actually matched 0 intents.
IntentMatcher: (has action: is "android.intent.action.SEND" and has extras: has bundle with: key: is "android.intent.extra.TEXT" value: is "Watch Enola Holmes with me!\n\nWhile searching for her missing mother, intrepid teen Enola Holmes uses her sleuthing skills to outsmart big brother Sherlock and help a runaway lord." and has type: is "text/plain")
Matched intents:[]
Recorded intents:
-Intent { act=android.intent.action.CHOOSER (has extras) } handling packages:[[android]], extras:[Bundle[{android.intent.extra.INTENT=Intent { act=android.intent.action.SEND typ=text/plain flg=0x1 clip={text/plain T:Watch Enola Holmes with me!
While searching for her missing mother, intrepid teen Enola Holmes uses her sleuthing skills to outsmart big brother Sherlock and help a runaway lord.} (has extras) }}]])
我怎样才能使测试符合意图?从报错信息来看两者已经一致了
问题是你需要添加一个CHOOSER
作为:
fun chooser(matcher: Matcher<Intent>): Matcher<Intent> {
return allOf(
hasAction(Intent.ACTION_CHOOSER),
hasExtra(`is`(Intent.EXTRA_INTENT), matcher))
}
然后你可以做:
intended(chooser(expectedIntent))
创建一个像这样的变量以匹配您的 Intent
private val expectedIntent = Matchers.allOf(
IntentMatchers.hasAction(Intent.ACTION_SEND),
IntentMatchers.hasExtra("Your key", "Watch ${dummyMovieData.title} with me!\n\n${dummyMovieData.summary}"),
IntentMatchers.hasType("text/plain")
)
然后将您的测试更改为:
@Test
fun test_clicking_share_icon_shows_sharing_sheet() {
Intents.init()
onView(withText(dummyMovieData.title)).perform(click())
onView(withId(R.id.share_detail)).perform(click())
intended(expectedIntent)
Intents.release()
}
我有一个 activity 的意图,我是这样创建的:
private fun startShareIntent() {
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "Watch ${viewmodel.movie.value?.title} with me!\n\n${viewmodel.movie.value?.summary}")
type="text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)
}
当我单击工具栏上的图标时,该功能是 运行。我想 运行 一杯 Espresso UI 对其进行测试,以检查 activity 启动是否确实符合上述意图。为此,我只是先检查意图是否真的是上述意图,如下所示:
@Test
fun test_clicking_share_icon_shows_sharing_sheet() {
val scenario = activityScenarioRule.scenario
Intents.init()
val expectedIntent = allOf(
hasAction(Intent.ACTION_SEND),
hasExtra(Intent.EXTRA_TEXT, "Watch ${dummyMovieData.title} with me!\n\n${dummyMovieData.summary}"),
hasType("text/plain")
)
onView(withText(dummyMovieData.title)).perform(click())
onView(withId(R.id.share_detail)).perform(click())
intended(expectedIntent)
Intents.release()
}
然而,这 returns 我 AssertionFailedError
:
junit.framework.AssertionFailedError: Wanted to match 1 intents. Actually matched 0 intents.
IntentMatcher: (has action: is "android.intent.action.SEND" and has extras: has bundle with: key: is "android.intent.extra.TEXT" value: is "Watch Enola Holmes with me!\n\nWhile searching for her missing mother, intrepid teen Enola Holmes uses her sleuthing skills to outsmart big brother Sherlock and help a runaway lord." and has type: is "text/plain")
Matched intents:[]
Recorded intents:
-Intent { act=android.intent.action.CHOOSER (has extras) } handling packages:[[android]], extras:[Bundle[{android.intent.extra.INTENT=Intent { act=android.intent.action.SEND typ=text/plain flg=0x1 clip={text/plain T:Watch Enola Holmes with me!
While searching for her missing mother, intrepid teen Enola Holmes uses her sleuthing skills to outsmart big brother Sherlock and help a runaway lord.} (has extras) }}]])
我怎样才能使测试符合意图?从报错信息来看两者已经一致了
问题是你需要添加一个CHOOSER
作为:
fun chooser(matcher: Matcher<Intent>): Matcher<Intent> {
return allOf(
hasAction(Intent.ACTION_CHOOSER),
hasExtra(`is`(Intent.EXTRA_INTENT), matcher))
}
然后你可以做:
intended(chooser(expectedIntent))
创建一个像这样的变量以匹配您的 Intent
private val expectedIntent = Matchers.allOf(
IntentMatchers.hasAction(Intent.ACTION_SEND),
IntentMatchers.hasExtra("Your key", "Watch ${dummyMovieData.title} with me!\n\n${dummyMovieData.summary}"),
IntentMatchers.hasType("text/plain")
)
然后将您的测试更改为:
@Test
fun test_clicking_share_icon_shows_sharing_sheet() {
Intents.init()
onView(withText(dummyMovieData.title)).perform(click())
onView(withId(R.id.share_detail)).perform(click())
intended(expectedIntent)
Intents.release()
}