Лучшая практика для тестирования Android Глубокие ссылки навигации в деятельности - PullRequest
0 голосов
/ 26 января 2020

У меня есть активность для удержания фрагмента. Я создал это для возможности запуска Deep Link к профилю. Также я передаю 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, но не смог найти способ передачи ему параметров.

1 Ответ

0 голосов
/ 26 января 2020

Метод newInstance() кажется совершенно бессмысленным, потому что Intent передается Activity; вам следует пересмотреть, как создается ProfileActivity, потому что это не так. getIntent() - это все, что вам нужно, чтобы получить Intent (как подсказывает название метода). Также следует принять во внимание предложение @ EpicPandaForce, чтобы избежать беспорядка. Однако это не был настоящий вопрос (просто сказать, потому что вы могли бы утверждать, что «это не работает»).


Тестирование Activity с глубокой связью Intent работает аналогично это:

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 в первую очередь).

Также убедитесь, что intent-filter в AndroidManifest.xml настроен правильно.

...