-
Notifications
You must be signed in to change notification settings - Fork 0
Checking if the function call in the view model is invoked
Devrath edited this page Jun 26, 2021
·
1 revision
- We usually come across a scenario where we are using a service.
- Consider this service as an analytics service for example, that logs some message to the analytics server.
- Now this service is passed as a reference for a view model.
- Using this reference, we are invoking a method of that service.
-
Objective of the scenario is we cant to check that if this log event is triggered when the ViewModel is invoked and its function is called.
viewModel class
class ImagesViewModel(
private val imageListProvider: ImageListProvider,
private val analytics: SpacingAnalytics
)
: ViewModel() {
val imageLiveData = MutableLiveData<List<ApodImage>>()
val errorLiveData = MutableLiveData<String>()
init {
viewModelScope.launch {
try {
analytics.logEvent("Fetching images")
val items = imageListProvider.buildImageList().filter { it.media_type == "image" }
imageLiveData.value = items
} catch (exception: Exception) {
errorLiveData.value = exception.message
}
}
}
}SpacingAnalytics service
class SpacingAnalytics {
fun logEvent(event: String, attributes: Map<String, String> = emptyMap()) {
val newAttribtues = attributes.toMutableMap()
newAttribtues["client_type"] = "Android"
newAttribtues["version"] = "1"
ThirdPartyAnalyticsProvider.logEvent(event, newAttribtues)
}
}Test function
@Test
fun `check if the fetching images event is logged in analytics`() {
val imageListProvider = mockk<ImageListProvider>()
val spacingAnalytics = mockk<SpacingAnalytics>()
// -----------------------------------------> SUT
ImagesViewModel(imageListProvider,spacingAnalytics)
// Fetching images is present in the init block so once the constructor is initiated the function is called
//Now we need to check if the method is called inside
every { spacingAnalytics.logEvent("Fetching the images") } just Runs
}