我想知道如何在SQLDelight的KMM上编写单元测试。首先,我甚至不能正确地添加SQLDelight依赖项。
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驱动程序依赖?
任何帮助都将不胜感激!
发布于 2021-06-08 04:23:37
我在测试中使用上下文时遇到了问题,我发现更快地使用内存数据库。这也有一个好处,不需要一个设备的测试。
我的做法是:
val androidTest by getting {
dependencies {
// ...
implementation("com.squareup.sqldelight:sqlite-driver:1.4.4")
}
}internal expect fun createTestSqlDriver(): SqlDriver
internal actual fun createTestSqlDriver(): SqlDriver {
return JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY).apply {
MyDatabase.Schema.create(this)
}
}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)
}
}我发现下列帖子很有用:
发布于 2021-01-11 14:28:09
您可以在KaMPKit中看到一个基本示例。
如果在非测试代码中配置了driver,则不需要commonTest中的驱动程序依赖项。
在我们的测试代码中,我们有一个expect来创建用于测试的db连接。
internal expect fun testDbConnection(): SqlDriver依赖项配置看起来(大致)如下:
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喜悦测试。
发布于 2021-05-18 15:41:05
谢谢你的回答!我遇到了另一个问题。“在用于JVM的模块createDriver( KMM.shared )中没有实际声明的函数‘KMM.shared’”。在KaMPKit项目中,我没有发现任何与JVM相关的东西。
使用SQLite入门JVM包含必要的指令。
您需要添加一个依赖项
dependencies {
implementation "com.squareup.sqldelight:sqlite-driver:1.5.0"
}进入您的"jvmMain“sourceSet,接下来在"jvmMain”模块中实现真正的乐趣createDriver。
我感谢凯文的回答,并补充说使用SqlDeLite的测试应该放在平台模块("androidTest“和"iosTest")中,而不是放在"commonTest”中。
您需要为您的SUT提供一个实际的驱动程序实现,使用app上下文。对于单元测试,您需要上下文的替代,例如,查看罗波列克。
添加依赖项
dependencies {
implementation("org.robolectric:robolectric:4.4")
}进入"androidTest“sourceSet (我不知道iOS可以使用什么),获取应用程序上下文:
val context = ApplicationProvider.getApplicationContext<Context>()并使用它获取驱动程序的平台实现:
val driver = DatabaseDriverFactory(context).createDriver(Database.Schema, "test.db")https://stackoverflow.com/questions/65663436
复制相似问题