how to unit test StateFlow event with lambdas using MockK and Turbine

172 views Asked by At

I am trying to unit test the onSignOutTapped method, but I am always getting an assertion failure due to the function parameters in the AlertDialogData object. I am trying to find a way to assert this event, but I am not sure what I am doing wrong. Can someone please help me?

class AccountViewModel @Inject constructor( ) : ViewModel() {
        
        
            private val mutableUiState =
                MutableStateFlow(AccountContract.UiState(showManageMyAccountWebPageUrl = appConfig.websiteurl.settings))
            val uiState: StateFlow<AccountContract.UiState> = mutableUiState.asStateFlow()
        
        
            fun onSignOutTapped() {
                mutableUiState.update(
                    alertDialogData = AlertDialogData(
                        title = resourcesSurface.getString(R.string.confirm_sign_out_title),
                        message = resourcesSurface.getString(R.string.account_confirm_sign_out_message_2),
                        showDialog = true,
                        confirmButtonText = resourcesSurface.getString(R.string.account_confirm_sign_out),
                        confirmButtonAction = { signOut() },
                        negativeButtonText = resourcesSurface.getString(R.string.btn_cancel),
                        negativeButtonAction = { dismissMessageDialogs() }
                    )
                )
            }
        
            private fun signOut() {
                ....
            }
        
        
            private fun onCloseMyAccountTapped() {
                ...
            }
        
        
        }
        
        -----------------------
    
    interface AccountContract {
    
        data class UiState(
            val menuItems: List<MenuItemDTO> = emptyList(),
            val alertDialogData: AlertDialogData? = null,
            val showManageMyAccountWebPageUrl: String? = null,
            val userEvents: UserEvents? = null
        )
    
        sealed class UserEvents {
            object NavigateToCloseMyAccountScreen : UserEvents()
            object OpenManageMyAccountWebPage : UserEvents()
        }
    }
        
        data class AlertDialogData(
            var title: String = "",
            var message: String = "",
            var showDialog: Boolean = false,
            var confirmButtonText: String = "",
            val confirmButtonTextColour: Int = R.color.primary,
            var confirmButtonAction: () -> Unit = {},
            var negativeButtonText: String = "",
            var negativeButtonTextColour: Int = R.color.primary,
            var negativeButtonAction: () -> Unit = {},
            var dismissButtonAction: () -> Unit = {}
        )
    

class AccountViewModelTest {
    
        @MockK
        lateinit var resourcesSurface: ResourcesSurface
    
        lateinit var viewModel: AccountViewModel
    
        @Before
        fun setup() {
            MockKAnnotations.init(this)
            viewModel = AccountViewModel()
    
    
        }
    
        @Test
        fun `When sign out is tapped, then show sign out prompt`() = runTest {
    
            every { resourcesSurface.getString(R.string.confirm_sign_out_title) } returns ("Confirm sign out?")
            every {
                resourcesSurface.getString(R.string.account_confirm_sign_out_message_2)
            } returns ("Are you sure you want to sign out of your account?")
            every {
                resourcesSurface.getString(R.string.account_confirm_sign_out)
            } returns ("Sign out")
            every {
                resourcesSurface.getString(R.string.btn_cancel)
            } returns ("Cancel")
    
            viewModel.onSignOutTapped()
    
    
    
            viewModel.uiState.test {
    
                assertEquals(
                    AccountContract.UiState(
                        showManageMyAccountWebPageUrl = "testURl",
                        userEvents = null,
                        alertDialogData = AlertDialogData(
                            title = "Confirm sign out?",
                            message = "Are you sure you want to sign out of your account?",
                            showDialog = true,
                            confirmButtonText = "Sign out",
                            confirmButtonAction = any(),
                            negativeButtonText = "Cancel",
                            negativeButtonAction = any()
                        )
                    ),
                    awaitItem()
                )
    
            }
    
    
        }
    
    
    }
    
    
    
    }
0

There are 0 answers