【问题标题】:Best practise for testing Android Deep Links navigation into activities测试 Android 深层链接导航到活动的最佳实践
【发布时间】:2020-01-26 19:25:12
【问题描述】:

我有一个持有片段的活动。我创建它是为了能够运行到配置文件的深层链接。我还将 PROFILE_ID 作为查询参数传递。所以整个深层链接看起来是这样的:“tigranes://home/profile?profileId=3545664”。

class ProfileActivity : BaseActivity() {

    companion object {
        @JvmStatic
        fun newInstance(context: Context, profileId: String): Intent {
            val intent = Intent(context, ProfileActivity::class.java)
            intent.putExtra(ProfileFragment.PROFILE_ID, profileId)
            return intent
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)

        val profileId: String = intent.getStringExtra(ProfileFragment.PROFILE_ID)
        val transaction = supportFragmentManager.beginTransaction()
        val fragment = ProfileFragment.newInstance(profileId)
        transaction.add(R.id.fragment_container, fragment)
        transaction.commit()
    }
}

所以我的问题是,如果这个深层链接正在打开 ProfileActivity,那么编写测试检查的最佳策略是什么。我尝试使用 ActivityTestRule,但找不到将参数传递给它的方法。

【问题讨论】:

  • 您创建片段的方式不正确。您应该在 if(savedInstanceState == null 中执行初始 FragmentTransaction,否则您将有重叠的片段。
  • 我知道 :) 问题是如何测试深层链接。
  • @TigranGhazinyan 回答了这个问题,但由于 ProfileActivity 看起来很相似,它可能不会导致预期的结果......您仍然可以通过调用 getIntent() 来验证答案。

标签: android unit-testing kotlin deep-linking android-testing


【解决方案1】:

方法newInstance() 似乎完全没有意义,因为Intent 正在传递给Activity;您应该重新考虑ProfileActivity 是如何构建的,因为它不是这样工作的。 getIntent() 是获取 Intent 所需的全部内容(正如方法名称所暗示的那样)。还应考虑@EpicPandaForce 的建议,以免造成混乱。然而,这不是真正的问题(只是说,因为你可能会声称“它不起作用”)。


使用深层链接 Intent 测试 Activity 的工作原理如下:

import android.content.Intent
import android.net.Uri
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class ProfileActivityTest {

    @get:Rule
    var testRule = activityScenarioRule<ProfileActivity>(
        Intent(Intent.ACTION_VIEW, Uri.parse(DEEP_LINK))
    )

    @Test
    ...

    companion object {
        val DEEP_LINK = "tigranes://home/profile?profileId=3545664"
    }
}

activityScenarioRule 取决于:

androidTestImplementation "androidx.test.ext:junit-ktx:1.1.1"

请让我知道这是否可行(这需要首先修复ProfileActivity)。

还要确保AndroidManifest.xml 中的intent-filter 设置正确。

【讨论】:

  • 这不适用于 DEEP_LINK 错误的情况,即应该有ActivityNotFoundException。 @Martin Zeitler
  • 深层链接不能出错,因为AndroidManifest.xml.. 中有一个intent-filter,这意味着你的测试用例是荒谬和无效的,因为intent-filter 永远不会得到一个未知网址。
  • 在这里,我认为测试是处理荒谬和无效案例的安全网 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多