首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在KMM上编写SQLDelight单元测试

如何在KMM上编写SQLDelight单元测试
EN

Stack Overflow用户
提问于 2021-01-11 08:20:37
回答 4查看 1.6K关注 0票数 4

我想知道如何在SQLDelightKMM上编写单元测试。首先,我甚至不能正确地添加SQLDelight依赖项。

代码语言:javascript
复制
    val commonTest by getting {
        dependencies {
            implementation(kotlin("test-common"))
            implementation(kotlin("test-annotations-common"))
            // SQLDelight tests
            implementation("com.squareup.sqldelight:sqlite-driver:1.4.3")
        }
    }

在我添加了依赖项,然后同步项目之后,项目甚至没有构建。请有人告诉我,这是否是正确的方式添加sqlite驱动程序依赖?

任何帮助都将不胜感激!

EN

回答 4

Stack Overflow用户

发布于 2021-06-08 04:23:37

我在测试中使用上下文时遇到了问题,我发现更快地使用内存数据库。这也有一个好处,不需要一个设备的测试。

我的做法是:

  1. 将JdbcSqliteDriver添加到androidTest源集(build.gradle在“共享”下)
代码语言:javascript
复制
val androidTest by getting {
    dependencies {
        // ...
        implementation("com.squareup.sqldelight:sqlite-driver:1.4.4")
    }
}
  1. 添加expect/ function函数以创建驱动程序:
  • 在"commonTest“目录下的文件中(例如,createTestSqlDriver.kt)

internal expect fun createTestSqlDriver(): SqlDriver

  • 在"androidTest“下的文件中
代码语言:javascript
复制
internal actual fun createTestSqlDriver(): SqlDriver {
    return JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY).apply {
        MyDatabase.Schema.create(this)
    }
}
  1. 现在,我可以在测试中创建和使用"commonTest“下的数据库。类似于:
代码语言:javascript
复制
internal class MyClassDbTests {

    private val sqlDriver = createTestSqlDriver()
    private val myDatabase = MyDatabase(sqlDriver)

    fun insert_addItems_verifyCorrectNumOfItemsInDb() {
        // GIVEN
        val myQueries = myDatabase.mydbQueries
        myQueries.deleteAllEvents()
        
        val numItemsBeforeInsertion = myQueries.selectAll().executeAsList().size

        // WHEN
        myQueries.insertItem(1, 2, 3)
        myQueries.insertItem(10, 20, 30)

        val numItemsAfterInsertion = myQueries.selectAll().executeAsList().size

        // THEN
        assertEquals(0, numItemsBeforeInsertion)
        assertEquals(2, numItemsAfterInsertion)
    }
}

我发现下列帖子很有用:

票数 7
EN

Stack Overflow用户

发布于 2021-01-11 14:28:09

您可以在KaMPKit中看到一个基本示例。

如果在非测试代码中配置了driver,则不需要commonTest中的驱动程序依赖项。

在我们的测试代码中,我们有一个expect来创建用于测试的db连接。

代码语言:javascript
复制
internal expect fun testDbConnection(): SqlDriver

然后在iOS安卓代码中定义actual

依赖项配置看起来(大致)如下:

代码语言:javascript
复制
commonMain {
  implementation("com.squareup.sqldelight:runtime:1.4.4")
}

androidMain {
 implementation("com.squareup.sqldelight:android-driver:1.4.4")
}

iosMain {
  implementation("com.squareup.sqldelight:native-driver:1.4.4")
}

有了这个功能,您应该能够编写sql喜悦测试。

票数 5
EN

Stack Overflow用户

发布于 2021-05-18 15:41:05

谢谢你的回答!我遇到了另一个问题。“在用于JVM的模块createDriver( KMM.shared )中没有实际声明的函数‘KMM.shared’”。在KaMPKit项目中,我没有发现任何与JVM相关的东西。

使用SQLite入门JVM包含必要的指令。

您需要添加一个依赖项

代码语言:javascript
复制
dependencies {
  implementation "com.squareup.sqldelight:sqlite-driver:1.5.0"
}

进入您的"jvmMain“sourceSet,接下来在"jvmMain”模块中实现真正的乐趣createDriver。

我感谢凯文的回答,并补充说使用SqlDeLite的测试应该放在平台模块("androidTest“和"iosTest")中,而不是放在"commonTest”中。

您需要为您的SUT提供一个实际的驱动程序实现,使用app上下文。对于单元测试,您需要上下文的替代,例如,查看罗波列克

添加依赖项

代码语言:javascript
复制
dependencies {
    implementation("org.robolectric:robolectric:4.4")
}

进入"androidTest“sourceSet (我不知道iOS可以使用什么),获取应用程序上下文:

代码语言:javascript
复制
val context = ApplicationProvider.getApplicationContext<Context>()

并使用它获取驱动程序的平台实现:

代码语言:javascript
复制
val driver = DatabaseDriverFactory(context).createDriver(Database.Schema, "test.db")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65663436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档