Open1

AndroidTest実行時にviewModelの状態管理を使うとき

るるすたるるすた

testクラスを作る

getアノテーションつけてルールを作る。

class CanvasSecTest {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()
}

テストしたい画面をセットアップ

viewModelを使っていくので、ここできちんと初期化することが大事。

class CanvasSecTest {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    private lateinit var viewModel: PromptViewModel  //後で定義

    @Before
    fun setUp() {
        composeTestRule.setContent {
            val vm = remember { PromptViewModel()}  //①
            viewModel = vm                        //②
            val uiState by vm.uiState.collectAsState()    //③
            CanvasSec(viewModel = vm, uiState = uiState)  //④
        }
    }

①val vm = remember { PromptViewModel()}

普段のテストなら、
 val vm = PromptViewModel()と直接インスタンス作ってます。(エラー出るけど無視)
 テストの中でviewModelを使わなければ、このままでも問題ないのですが、
 使う場合は、viewModelが正しく取得できずエラーになります。
 テストはcompose関数ではないので、collectAsStateで監視できないです。
 (composeの変化のトリガーにならない)
 viewModelごとrememberすることで、記憶・監視できるようになる。

②viewModel = vm

①で作ったvmをviewModel変数に入れることによって、
 後ほど作成するテスト関数からvm(remember{PromptviewModel()}のこと)を参照できる。

③val uiState by vm.uiState.collectAsState()

これよくわからない。
 collectAsStateで監視できないといいつつ、uiStateは監視するのね。
 調べたら、改めてここを更新することにしよう。
 今はこのままで。。。

状態をテスト関数から呼び出す

compose関数から呼び出すみたいに、普通に以下のようにすればOK。
val selected =viewModel.uiState.value.canvasState.size

実際に問題なく動いたコード

    //キャンバスの大きさのラジオボタンをクリックしたときに、選択したものにチェックが入っているか
    @Test
    fun updatesCanvasSizeWhenOptionSelected() {

        val text2 = composeTestRule.activity.getString(R.string.canvas_size_2)  //9:16
        composeTestRule.onNodeWithTag(text2,useUnmergedTree = true).performClick()     //9:16という文字列をクリックしてる
        composeTestRule.waitForIdle()   //待つ
        log("ok")
        log(viewModel.uiState.value.canvasState.size)

        composeTestRule.runOnIdle {
            val selected = viewModel.uiState.value.canvasState.size
            assert(selected == text2)
        }
    }