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)
}
}