所以我正在使用 Firebase 后端構建一個聊天應用程式。在實作 ViewModel 和實際片段之前,我想檢查我的 Firebase 存盤庫是否作業。我的電話讓用戶會這樣
Fragmet -> ViewModel -> Repository -> FirebaseRepository -> 暫停樂趣 getAllUsers() : ArrayList
代碼是:
class Repository(val firebaseRepository : FirebaseRepository) {
suspend fun getAllUsersFromFirebase() : ArrayList<UserInfo> {
return firebaseRepository.getAllUsers()
}
}
class FirebaseRepository() {
private val TAG = "FIREBASE REPOSITORY : "
private val firebaseAuth:FirebaseAuth = FirebaseAuth.getInstance()
private val firebaseDatabase :FirebaseDatabase = FirebaseDatabase.getInstance()
suspend fun getAllUsers() : ArrayList<UserInfo> {
val ref = firebaseDatabase.getReference("/users")
val userList = ArrayList<UserInfo>()
ref.addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
if(snapshot.exists()) {
Log.d(TAG,"$snapshot")
val tempList = ArrayList<UserInfo>()
for(child in snapshot.children){
val temp = child.getValue(UserInfo::class.java)
if(!temp?.userId!!.equals(firebaseAuth.currentUser!!.uid)) {
tempList.add(temp)
}
}
}
}
override fun onCancelled(error: DatabaseError) {
Log.d(TAG,"$error ${error.message}")
}
})
if(userList.isEmpty()) {
userList.add(UserInfo("NO USER FOUND","NO USER FOUND","NO USER FOUND","NO USER FOUND"))
}
return userList
}
}
那么我該如何測驗呢?我推測 firebaseAuth 可能會造成問題。我想我可以處理它,但我如何測驗這個 firebase 呼叫?
uj5u.com熱心網友回復:
我想檢查我的 firebase 存盤庫是否有效。
它不起作用,因為您回傳的userList是方法的結果,這實際上是不可能的,因為 Firebase API 是異步的。所以這里的問題是,您附加的偵聽器在查詢完成后的一段未知時間內被呼叫,您永遠不知道它需要多長時間。根據您的連接速度和狀態,可能需要幾百毫秒到幾秒鐘才能獲得該資料。
話雖如此,在userList呼叫回呼之前,您將是空的。這意味著您應該始終使用回呼中的結果。我寫了一篇關于這個主題的文章,名為它將幫助您理解這個概念:
- 如何使用 get() 從 Firebase 實時資料庫中讀取資料?
如果您想創建一個單元測驗,那么我建議您使用mockito并使用以下帖子中的答案:
- 使用 Mockito 和 Firebase 進行單元測驗
PS您的getAllUsers()方法不需要暫停樂趣,因為您沒有在那里使用任何 await() 。如果您想使用它,我建議您閱讀以下文章:
- 如何優化 Firebase 實時資料庫呼叫以提高性能?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406800.html
標籤:
