Как мне провести модульное тестирование для модели представления, у которой есть функция получения токена из API?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как мне провести модульное тестирование для модели представления, у которой есть функция получения токена из API?

Сообщение Anonymous »

Я работал над этим своим заданием. чтобы провести модульный тест на модели представления. но модель представления на самом деле получает токен из API. делает манекен для токена, верно? также у меня проблема с тем, чтобы модульный тест работал
Модульный тест должен проверять успешную загрузку данных:
  • проверьте, не являются ли данные нулевыми
  • проверьте, соответствует ли длина данных ожидаемой
  • проверьте, верны ли первые полученные данные
  • проверьте, верны ли первые полученные данные
  • проверьте, не являются ли данные нулевыми
    проверьте, соответствует ли длина данных ожидаемой li>
и когда данные истории недоступны:
-проверьте, являются ли полученные данные нулевыми или пустыми.
здесь находится ошибка, возникшая в результате первого модульного теста, который я пытаюсь исправить.
Ошибка модульного теста p>
это модульный тест

Код: Выделить всё

@ExperimentalCoroutinesApi
@RunWith(MockitoJUnitRunner::class)
class MainViewModelTest {
@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()

@get:Rule
val mainDispatcherRules = MainDispatcherRule()

@Mock
lateinit var storyRepository: UserRepository

@Test
fun `when Get Quote Should Not Null and Return Data`() = runTest {
val dummyQuote = DataDummy.generateDummyStoryResponse()
val data: PagingData = QuotePagingSource.snapshot(dummyQuote)
val expectedQuote = MutableLiveData
>()
expectedQuote.value = data
val dummyUserModel = UserModel(email = "[email protected]" , token = dummyToken, userId = "232321", name ="Charlie", isLogin = true)
val dummyFlow = flowOf(dummyUserModel)
//bug baris 50
val mainViewModel = MainViewModel(storyRepository)
Mockito.`when`(storyRepository.getSession()).thenReturn(dummyFlow)
Mockito.`when`(storyRepository.getStoriesWithPaging(dummyToken)).thenReturn(expectedQuote)

val actualQuote: PagingData = mainViewModel.stories.getOrAwaitValue()
val differ = AsyncPagingDataDiffer(
diffCallback = StoryAdapter.StoryDiffCallback(),
updateCallback = noopListUpdateCallback,
workerDispatcher = Dispatchers.Main,
)
differ.submitData(actualQuote)

Assert.assertNotNull(differ.snapshot())
Assert.assertEquals(dummyQuote.size, differ.snapshot().size)
Assert.assertEquals(dummyQuote[0], differ.snapshot()[0])

}
companion object {
private const val dummyToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyLWRlX29wd1dmN0s4QVhNSTkiLCJpYXQiOjE2NjcwNDYxMzN9._TmFRjqq3BL8R--c1mIDTB2UwaJfFDCv_kt8lxNfnMU"
}

@Test
fun `when Get Quote Empty Should Return No Data`() = runTest {
val data: PagingData = PagingData.from(emptyList())
val expectedQuote = MutableLiveData()
expectedQuote.value = data
val dummyUserModel = UserModel(email ="[email protected]" , token = dummyToken, userId = "232321", name ="Charlie", isLogin = true)
val dummyFlow = flowOf(dummyUserModel)
Mockito.`when`(storyRepository.getSession()).thenReturn(dummyFlow)
Mockito.`when`(storyRepository.getStoriesWithPaging(dummyToken)).thenReturn(expectedQuote)
val mainViewModel = MainViewModel(storyRepository)
val actualQuote: PagingData = mainViewModel.stories.getOrAwaitValue()
val differ = AsyncPagingDataDiffer(
diffCallback = StoryAdapter.StoryDiffCallback(),
updateCallback = noopListUpdateCallback,
workerDispatcher = Dispatchers.Main,
)
differ.submitData(actualQuote)
Assert.assertEquals(0, differ.snapshot().size)
}

}

class QuotePagingSource : PagingSource() {
companion object {
fun snapshot(items: List): PagingData {
return PagingData.from(items)
}
}

override fun getRefreshKey(state: PagingState): Int {
return 0
}

override suspend fun load(params: LoadParams): LoadResult  {
return LoadResult.Page(emptyList(), 0, 1)
}
}

val noopListUpdateCallback = object : ListUpdateCallback {
override fun onInserted(position: Int, count: Int) {}
override fun onRemoved(position: Int, count: Int) {}
override fun onMoved(fromPosition: Int, toPosition: Int) {}
override fun onChanged(position: Int, count: Int, payload: Any?) {}
}

здесь находится модель представления, которую я хочу провести модульный тест

Код: Выделить всё

class MainViewModel(private val repository: UserRepository) : ViewModel() {

private val _stories = MutableLiveData
>()
val stories: LiveData get() = _stories

private val _isLoading = MutableLiveData()

fun getSession(): LiveData {
return repository.getSession().asLiveData()
}

private val _userToken = MediatorLiveData()
val userToken: LiveData get() = _userToken

init {
_userToken.addSource(repository.getSession().asLiveData()) { userModel ->
_userToken.value = userModel.token
}
}

fun getStory() {
userToken.observeForever { token ->
_isLoading.value = true
viewModelScope.launch {
try {
repository.getStoriesWithPaging(token).observeForever { pagingData ->
_stories.value = pagingData
}
} catch (e: Exception) {
// Tangani error jika ada
} finally {
_isLoading.value = false
}
}
}

}

fun logout() {
viewModelScope.launch {
repository.logout()
}
}

}
пожалуйста, помогите мне. и должен ли я отправить свой репозиторий GitHub, чтобы было понятнее?
Я пытался исправить параметр, указанный как ненулевой, пытаясь получить токен данных из get session(), но это создает дополнительную проблему поскольку хранилище данных, которое я использую, имеет значение null, потому что оно не получило ответ на вход, возвращающий токен из API.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-get-it
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»