You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Multiplatform wasmJs目标单元测试中如何导入二进制数据?

Kotlin Multiplatform wasmJs目标单元测试中如何导入二进制数据?

我来帮你解决这个Kotlin/Wasm单元测试中加载二进制数据的问题——确实,WasmJs目标不像JVM那样能直接读取本地文件,不过有几个实用的方案可以搞定:

  • 方法一:Base64编码嵌入(最直接,适配所有文件大小)
    先把你的二进制文件转换成Base64字符串(用本地工具或者离线转换方式就行,不用上传到第三方网站),然后把这个字符串硬编码到测试代码里,再解码回ByteArray。
    代码示例:

    import kotlin.text.Base64
    import kotlinx.io.ByteArray
    
    class BinaryDataTest {
        // 替换成你的文件转出来的Base64字符串
        private val testDataBase64 = "VGhpcyBpcyB0ZXN0IGJpbmFyeSBkYXRhLg=="
    
        private val testData: ByteArray
            get() = Base64.decode(testDataBase64)
    
        @Test
        fun testBinaryProcessing() {
            // 这里直接用testData进行测试逻辑
            println("Loaded data size: ${testData.size}")
        }
    }
    

    这个方法的好处是完全不依赖环境配置,测试代码自包含,不会受Wasm资源加载的限制。

  • 方法二:利用测试资源+Kotlin/Wasm的资源加载API(适合保留原始文件的场景)
    如果你不想把数据转成字符串,想保留原始二进制文件,可以通过配置测试资源+fetch API来读取:

    1. 先在项目里创建测试资源目录,比如src/commonTest/resources,把你的二进制文件(比如test-data.bin)放入其中。
    2. 在build.gradle.kts里确保wasmJs测试的资源被正确配置:
      kotlin {
          wasmJs {
              testRuns.named("test") {
                  executionTask.configure {
                      useKarma() // 如果你用Karma作为测试运行器
                  }
              }
          }
          sourceSets {
              val commonTest by getting {
                  resources.srcDir("src/commonTest/resources")
              }
          }
      }
      
    3. 在wasmJs的测试代码里用协程+fetch读取资源(记得用runTest包装协程测试):
      import kotlinx.coroutines.runTest
      import kotlinx.io.ByteArray
      import org.w3c.fetch.fetch
      
      class ResourceDataTest {
          @Test
          fun testWithResource() = runTest {
              // 资源路径对应资源目录里的文件
              val response = fetch("test-data.bin")
              require(response.ok) { "Failed to load test resource" }
              val arrayBuffer = response.arrayBuffer()
              val testData = arrayBuffer.toByteArray()
      
              // 这里编写你的测试逻辑
          }
      }
      

    注意:这个方法依赖测试运行器(比如Karma)正确把资源暴露给测试环境,要确保配置没有出错。

  • 方法三:用expect/actual实现跨平台统一测试(多目标KMP项目推荐)
    如果你需要在所有目标(JVM、WasmJs等)里复用同一份测试逻辑,可以用KMP的expect/actual机制隔离平台差异:

    1. 在commonTest里定义一个期望函数:
      expect fun loadTestBinaryData(): ByteArray
      
    2. 在wasmJsTest里实现actual函数(用上面的Base64或者资源加载方式):
      actual fun loadTestBinaryData(): ByteArray {
          // 这里用Base64解码的实现示例
          val base64Str = "你的Base64字符串"
          return Base64.decode(base64Str)
      }
      
    3. 在JvmTest里实现actual函数(用传统的文件读取):
      import java.io.File
      
      actual fun loadTestBinaryData(): ByteArray {
          return File("src/commonTest/resources/test-data.bin").readBytes()
      }
      

    这样在commonTest的测试代码里,你只需要调用loadTestBinaryData(),完全不用关心当前是哪个平台,测试逻辑可以100%复用。

备注:内容来源于stack exchange,提问作者mipa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:58:01