意式浓缩咖啡与我的 ACTION_SEND 意式不符 [英] Espresso intended is not matching my ACTION_SEND intent

查看:27
本文介绍了意式浓缩咖啡与我的 ACTION_SEND 意式不符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个来自我创建的活动的意图:

I have an intent from an activity that I created like so:

    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 测试,以检查启动的活动是否确实符合上述意图.为此,我只是首先检查意图是否实际上是上述意图,如下所示:

That function is run when I click on an icon on the toolbar. I want to run an Espresso UI test on it to check if the activity started is indeed of the above intent. To do that, I'm just checking first if the intent is actually the above intent like so:

    @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()
    }

然而,这会返回一个 AssertionFailedError:

However, this returns me an 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) }}]])

我怎样才能使测试符合意图?从报错信息来看,两者已经是一样的了.

How can I make it so that the test can match the intent? It seems from the error message the two are already the same.

推荐答案

问题是需要添加一个CHOOSER为:

The problem is that you need to add a CHOOSER as :

fun chooser(matcher: Matcher<Intent>): Matcher<Intent> {
      return allOf(
          hasAction(Intent.ACTION_CHOOSER),
          hasExtra(`is`(Intent.EXTRA_INTENT), matcher))
}

然后你可以这样做:

intended(chooser(expectedIntent))

创建一个这样的变量来匹配你的Intent

Create a variable like this one to match with your 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")
        )

然后将您的测试更改为:

Then change your test to :

@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()
    }

这篇关于意式浓缩咖啡与我的 ACTION_SEND 意式不符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆