Keyword: SQLDelight Mock Test
直到27日,完成KMM的測試功能放在
KMMDay27
昨天測試了Ktor,今天開始也要測試SQLDelight的運作正不正常.SQLDelight的測試非常簡單,只要利用SQLDriver建立一個Mock的SQLDelight Database即可.其他就跟一般使用是相同流程.跟證實環境同樣的,要因應不同平台撰寫SqlDriver
我們先在昨天的commonTest資料夾下,mockKtor的相同層級,建立一個expect fun 來提供SqlDriver
//這是在commonTest底下的任意檔案 使用Kotlin語言
internal expect fun testDbConnection(): SqlDriver
然後有expect就有actual ,在雙平台實作actual方法.同樣的actual的package page要與expect相同.
首先是Android,我們直接照著CafeDB的Schema建立AndroidSqliteDriver
//這是在androidTest底下的實作testDBConnection 使用Kotlin語言
internal actual fun testDbConnection(): SqlDriver {
val app = ApplicationProvider.getApplicationContext<Application>()
return AndroidSqliteDriver(CafeDB.Schema, app, "cafedb")
}
然後iOS的部分也類似的做,同樣建立NativeSqliteDriver.因為iOS與Android所使用到的Driver種類是不同的.
//這是在iosTest底下的實作testDBConnection 使用Kotlin
actual fun testDbConnection(): SqlDriver {
val schema = CafeDB.Schema
return NativeSqliteDriver(
DatabaseConfiguration(
name = "cafeDB",
version = schema.version,
create = { connection ->
wrapConnection(connection) { schema.create(it) }
},
upgrade = { connection, oldVersion, newVersion ->
wrapConnection(connection) { schema.migrate(it, oldVersion, newVersion) }
},
inMemory = true
)
)
}
有了Driver就有如有了DB,我們開始撰寫測試
回到commonTest的package底下,我們開始撰寫有關DB測試的測試案例.雖然可以直接寫在昨天的測試案例檔內,但是由於要測試的部分不同,還是開一個新的測試檔SQLDelightTest吧
//這是在commonTest底下的測試檔 使用Kotlin
class SQLDelightTest : BaseTest() {
private lateinit var dbHelper: DatabaseHelper
@BeforeTest
fun setup() = runTest {//在開始測試前會執行這段 建立新的dbHelper
dbHelper = DatabaseHelper(
testDbConnection(),//這段會使用到SQLDriver,由各平台實作
Dispatchers.Default
)
}
}
然後我們在開始測試之前先偷塞幾筆假資料進去
//這是在commonTest底下的測試檔 使用Kotlin
class SQLDelightTest : BaseTest() {
private lateinit var dbHelper: DatabaseHelper
@BeforeTest
fun setup() = runTest {
dbHelper = DatabaseHelper(
testDbConnection(),
Dispatchers.Default
)
dbHelper.deleteALLCafe()//清空測試DB
dbHelper.insertFakeCafe(0)//偷塞假資料
}
private suspend fun DatabaseHelper.insertFakeCafe(id: Int) {
val fakeList = listOf(CafeResponseItem("fakeId$id", "fakeAddress", "fakeName", "fakeCity"))
insertCafeList(fakeList)
}
}
然後撰寫測試內容,來測試Query的回傳值正不正確
class SQLDelightTest : BaseTest() {
...
@Test
fun queryTest() = runTest {
val CAFEList = dbHelper.selectAllItems().first()
assertNotNull(CAFEList.find { it.id == "fakeId0" }, "cant find target CAFE")
}
...
}
以及DeleteAll有沒有正常運作
class SQLDelightTest : BaseTest() {
...
@Test
fun DeleteAllTest() = runTest {
dbHelper.insertFakeCafe(1)
dbHelper.insertFakeCafe(2)
assertTrue(dbHelper.selectAllItems().first().isNotEmpty())
dbHelper.deleteALLCafe()
assertTrue(
dbHelper.selectAllItems().first().count() == 0,
"delete all Cafe not complete"
)
}
}
執行看看結果