애플리케이션 로직이 올바른지 확인하기 위해 ViewModel을 테스트하는 것은 좋은 생각이다. 이 섹션에서는 상태에 대해 State<T>를 사용하여 ViewModel을 테스트 하는 방법을 보여주는 테스트 코드를 작성할 것이다.

TodoViewModelTest에 테스트 추가하기

class TodoViewModelTest {

   @Test
   fun whenRemovingItem_updatesList() {
       // before
       val viewModel = TodoViewModel()
       val item1 = generateRandomTodoItem()
       val item2 = generateRandomTodoItem()
       viewModel.addItem(item1)
       viewModel.addItem(item2)

       // during
       viewModel.removeItem(item1)

       // after
       assertThat(viewModel.todoItems).isEqualTo(listOf(item2))
   }
}

이 테스트는 이벤트에 의해 직접 수정되는 State<T>를 테스트하는 방법을 보여준다. 이전 섹션에서 새 ViewModel을 만든 다음 todoItems에 두 개의 항목을 추가한다.

우리가 테스트할 메소드는 목록의 첫 번째 아이템을 제거하는 removeItem이다.

마지막으로 목록에 두 번째 아이템만 포함되어 있다고 확신하기 위해 assert 메서드를 사용한다.

업데이트가 테스트에 의해 직접 발생한 경우(여기에서 removeItem을 호출하여 수행하는 것처럼) 테스트에서 todoItems를 읽기 위해 추가 작업을 수행할 필요가 없다. 이건 그냥 List<TodoItem>일 뿐이다.

경고: MutableState<T>에 대한 쓰기가 다른 스레드에서 수행되면 테스트에서 즉시 표시되지 않는다.

변경 사항을 표시하기 위한 저수준 API는 Snapshot.sendApplyNotifications()이다.

이를 처리하기 위한 높은 수준의 API는 현재 작업 중이며, 작업이 완료되면 이 코드랩은 업데이트 된다.

이 ViewModel에 대한 나머지 테스트는 동일한 기본 패턴을 따르므로 이 코드랩 연습용으로 두고 건너뛰도록 한다. ViewModel의 더 많은 테스트를 추가하여 작동하는지 확인하거나, 완성된 모듈에서 TodoViewModelTest를 열어 더 많은 테스트를 볼 수 있다.

다음 섹션에서는 새로운 편집모드를 UI에 추가하도록 하자.

경고: 테스트에서 State<T> 객체에 대한 쓰기를 기다리는 API가 현재 없다.

예를 들어, 데이터베이스 호출에 의해 todoItem들이 비동기적으로 채워진 경우, 업데이트될 때까지 기다릴 방법이 현재로서는 없다. 1.0 이전에 이에 대한 API가 있을 것으로 예상하지만 아직 준비되지 않았다.

카테고리: Compose

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.