3

ここから、robolectric にはシャドウ オブジェクトがないことがわかりましたが、スナックバー用のカスタム シャドウ オブジェクトを作成できます。

ネットワーク接続がないときに、コードにスナックバーを表示しています。ネットワーク接続がないときにスナックバーが表示されることを確認できる単体テスト (テスト ランナーとして robolectric を使用) を作成する方法を知りたいです。

スナックバーがxmlにないため、少し難しいです。したがって、実際のアクティビティコントローラーを宣言すると、その時点ではスナックバーがありません。

私たちが持っているトーストをテストする方法を知っていますかShadowToast.getTextOfLatestToast()

現在 org.robolectric:robolectric:3.0-rc2 を使用していますが、ShadowSnackbar.class が利用可能ではありません。

4

2 に答える 2

2

もっと簡単な答えを投稿しました

あなたはただ行うことができます:

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
}
于 2018-06-14T14:58:59.570 に答える