[英]android snackbar - how to test with roboelectric
从这里我们现在知道 robolectric 没有影子 object 但我们可以为小吃店创建一个自定义影子 object。很遗憾他们有一个用于吐司但没有用于小吃店。
当没有网络连接时,我在我的代码中显示了一个 snackbar。 我想知道如何编写一个单元测试(使用 robolectric 作为测试运行程序)来验证在没有网络连接时是否显示小吃店。
它有点难,因为小吃店不在 xml 中。所以当我声明我的实际活动 controller 时,它当时没有小吃店。
你知道如何测试吐司我们有ShadowToast.getTextOfLatestToast()
我想要一个用于 snackBar
我目前正在使用 org.robolectric:robolectric:3.0-rc2 并且看不到 ShadowSnackbar.class 可用。
实际上,在blogpost中解释了如何添加ShadowToast类以启用测试。
在您的应用程序代码中,当没有可用的互联网连接时,您将在Snackbar上调用。 由于Snackbar作为Instrumented类的配置(例如拦截),将使用该类的Shadow-variant。 您将能够在那一刻评估结果。
我发布了一个更简单的答案
你可以这样做:
val textView: TextView? = rootView.findSnackbarTextView() assertThat(textView, `is`(notNullValue()))
执行:
/**
* @return a TextView if a snackbar is shown anywhere in the view hierarchy.
*
* NOTE: calling Snackbar.make() does not create a snackbar. Only calling #show() will create it.
*
* If the textView is not-null you can check its text.
*/
fun View.findSnackbarTextView(): TextView? {
val possibleSnackbarContentLayout = findSnackbarLayout()?.getChildAt(0) as? SnackbarContentLayout
return possibleSnackbarContentLayout
?.getChildAt(0) as? TextView
}
private fun View.findSnackbarLayout(): Snackbar.SnackbarLayout? {
when (this) {
is Snackbar.SnackbarLayout -> return this
!is ViewGroup -> return null
}
// otherwise traverse the children
// the compiler needs an explicit assert that `this` is an instance of ViewGroup
this as ViewGroup
(0 until childCount).forEach { i ->
val possibleSnackbarLayout = getChildAt(i).findSnackbarLayout()
if (possibleSnackbarLayout != null) return possibleSnackbarLayout
}
return null
}
这对我有用,但这是一个非常简单的用例
@Implements(Snackbar::class)
class CustomShadowSnackbar {
companion object {
val shownSnackbars = mutableListOf<Snackbar>()
fun Snackbar.getTextMessage(): String {
val view = (this.view as ViewGroup)
.children
.first { it is SnackbarContentLayout } as SnackbarContentLayout
return view.messageView.text.toString()
}
fun clear() {
shownSnackbars.clear()
}
}
@RealObject
lateinit var snackbar: Snackbar
@Implementation
fun show() {
shownSnackbars.add(snackbar)
}
@Implementation
fun __constructor__(
context: Context,
parent: ViewGroup,
content: View,
contentViewCallback: ContentViewCallback) {
Shadow.invokeConstructor(
Snackbar::class.java,
snackbar,
ReflectionHelpers.ClassParameter(Context::class.java, context),
ReflectionHelpers.ClassParameter(ViewGroup::class.java, parent),
ReflectionHelpers.ClassParameter(View::class.java, content),
ReflectionHelpers.ClassParameter(ContentViewCallback::class.java, contentViewCallback)
)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.