iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0

Keyword: SQLDelight Mock Test
直到27日,完成KMM的測試功能放在
KMMDay27


昨天測試了Ktor,今天開始也要測試SQLDelight的運作正不正常.SQLDelight的測試非常簡單,只要利用SQLDriver建立一個Mock的SQLDelight Database即可.其他就跟一般使用是相同流程.跟證實環境同樣的,要因應不同平台撰寫SqlDriver

建立SQLDelight DB Driver

我們先在昨天的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,我們開始撰寫測試

DB Test

回到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"
        )
    }
}

執行看看結果

https://github.com/officeyuli/itHome2021/raw/main/day27/1633187669816.jpg


上一篇
Day 26: Server我也不要了,Mock Ktor 環境
下一篇
Day 28: 拯救失足專案,在現有專案內引入KMM
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言