【问题标题】:Coroutines test with firebase hanging foreverFirebase 的协程测试永远挂起
【发布时间】:2022-01-01 14:04:05
【问题描述】:

我做了一个简单的单元测试来测试一个使用 firebase 的协程函数。 我已经模拟了我正在测试的这个函数中使用的所有依赖项和方法,但它继续挂起。我不确定它到底挂在哪里,但我会假设对 firestore 的嘲笑,它有 await()。

测试类:


import android.content.Context
import com.example.socialtoker.data.db.UserDao
import com.example.socialtoker.data.repository.UserDataRepository
import com.example.socialtoker.data.repository.UserDataRepositoryImpl
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DatabaseReference
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.FirebaseStorage
import io.mockk.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4

@RunWith(JUnit4::class)
@ExperimentalCoroutinesApi
class UserDataRepositoryImplTest {

    private val contextMock = mockk<Context>{
        every { getExternalFilesDir(any())?.absolutePath } returns "src/SocialToker/"
    }
    private val firestoreMock = mockk<FirebaseFirestore>{
        coEvery { collection("Users").document(any()).set(any()).await() } returns mockk()
    }
    private val firebaseAuthMock = mockk<FirebaseAuth>{
        coEvery { createUserWithEmailAndPassword(any(), any()) } returns mockk()
        every { currentUser?.uid } returns "UID"
    }
    private val firebaseStorageMock = mockk<FirebaseStorage>()
    private val firebaseDatabaseMock = mockk<DatabaseReference>()
    private val daoMock = mockk<UserDao>{
        coEvery { addUser(any()) } returns mockk()
    }

    private lateinit var userDateRepository: UserDataRepository

    private val emailAddress = "socialtoker@socialtoker.com"
    private val password = "socialtokerpassword"
    private val username = "socialtoker"



    @Before
    fun setup() {
        userDateRepository = UserDataRepositoryImpl(
            contextMock,
            firestoreMock,
            firebaseAuthMock,
            firebaseStorageMock,
            firebaseDatabaseMock,
            daoMock
        )
    }

    @Test
    fun `createUser calls firebase and stores user info locally and remotely`() = runBlocking {
        // WHEN
        userDateRepository.createUser(emailAddress, password, username)

        //THEN
        coVerify { firebaseAuthMock.createUserWithEmailAndPassword(emailAddress, password) }
    }


}

测试对象:

    override suspend fun createUser(email: String, password: String, username: String): AuthResult {
        try {
            val data = hashMapOf(
                "name" to username
            )
            val authResult = firebaseAuth.createUserWithEmailAndPassword(email, password).await()
            val uid = firebaseAuth.currentUser!!.uid
            userDao.addUser(UserData(uid, username, "", ""))
            firestoreRef.collection("Users")
                .document(uid)
                .set(data).await()
            return authResult
        } catch (error: Throwable) {
            throw RepositoryError(
                error.localizedMessage ?: "Unable to create user", error
            )
        }
    }

【问题讨论】:

  • 如果没有人可以帮助解决这个问题,我很想采取一种稍微不同的方法,将 firebase 调用和我的本地 dao 调用提取到它们各自的 repos 中,这些 repos 将从我的主 repo 中调用。

标签: android firebase kotlin testing firebase-authentication


【解决方案1】:

请注意,awaitTask 类上是 an extension function。 因此Mocking extension functions 可能需要考虑在内。

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2019-11-24
    • 2021-11-27
    • 1970-01-01
    • 2014-04-30
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多