gpt4 book ai didi

android - 如何测试使用 ActivityResult API 的 Activity?

转载 作者:行者123 更新时间:2023-12-03 08:26:48 25 4
gpt4 key购买 nike

docs在测试 Fragments 时非常好,但是没有关于如何测试使用 ActivityResult 的 Activity 的信息。

我们应该如何在 Activity 测试中重写 activityResultRegistry

最佳答案

将您的合约写入单独的文件中,以便您可以轻松测试合约并在运行时提供您自己的 ActivityResultRegistry 来伪造预期结果。实际上调用真实的合约来从 Activity 中进行测试是不好的做法。设计合约的核心目的之一是将 Activity 代码与 onActicityResults 解耦

class ImageContract(registry: ActivityResultRegistry) {

private val contractUriResult : MutableLiveData<Uri> = MutableLiveData(null)

private val getPermission = registry.register(REGISTRY_KEY, ActivityResultContracts.GetContent()) { uri ->
contractUriResult.value = uri
}

fun getImageFromGallery(): LiveData<Uri> {
getPermission.launch("image/*")
return contractUriResult
}

companion object {
private const val REGISTRY_KEY = "Image Picker"
}
}

在您的 Activity 中

 ImageContractHandler(activityResultRegistry).getImageFromGallery().observe(this, {
it?.let { u ->
backgroundImageView.setImageURI(u)
}
})

在您的测试中

@Test
fun activityResultTest() {

// Create an expected result URI
val testUrl = "file//dummy_file.test"
val expectedResult = Uri.parse(testUrl)

// Create the test ActivityResultRegistry
val testRegistry = object : ActivityResultRegistry() {
override fun <I, O> onLaunch(
requestCode: Int,
contract: ActivityResultContract<I, O>,
input: I,
options: ActivityOptionsCompat?
) {
dispatchResult(requestCode, expectedResult)
}
}

val uri = ImageContractHandler(testRegistry).getImageFromGallery().getOrAwaitValue()
assert(uri == expectedResult)
}

用于在 Tests 中的同一线程上监听 LiveData,这是一个著名的 livedata 测试扩展

fun <T> LiveData<T>.getOrAwaitValue(
time: Long = 2,
timeUnit: TimeUnit = TimeUnit.SECONDS,
afterObserve: () -> Unit = {}
): T {
var data: T? = null
val latch = CountDownLatch(1)
val observer = object : Observer<T> {
override fun onChanged(o: T?) {
data = o
latch.countDown()
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d2a6babba192b5b7a69da093a5b3bba684b3bea7b7fca0b7bfbda4b79db0a1b7a0a4b7a0" rel="noreferrer noopener nofollow">[email protected]</a>(this)
}
}
this.observeForever(observer)

afterObserve.invoke()

// Don't wait indefinitely if the LiveData is not set.
if (!latch.await(time, timeUnit)) {
this.removeObserver(observer)
throw TimeoutException("LiveData value was never set.")
}

@Suppress("UNCHECKED_CAST")
return data as T
}

关于android - 如何测试使用 ActivityResult API 的 Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66420219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com