有没有办法让等号 (==) 检查 kotlin.js.Date 对象工作?

Is there a way to make equals (==) check on kotlin.js.Date object work?

我想就我们在 Kotlin Multiplatform 项目中尝试对特定平台 Date class 进行单元测试时遇到的问题提出一些 help/suggestions 问题。

我们的 Kotlin 多平台库目标; JVM, Native & JavaScript 并且正在使用特定于平台的日期 classes:

通过 expected/actual Date class 公开并在 public 域中使用 classes 在公共包中。例如:

public data class Event {
    val id: String,
    val start: Date
}

长话短说;在进行单元测试时,我们发现 assertEquals 对 JVM 和 Native 有效,但对 JavaScript 无效。例如:

import kotlin.js.Date
import kotlin.test.Test
import kotlin.test.assertEquals

class DateEqualsTest {

    @Test
    // Fails!
    fun dateEquals() {
        val first = Date(1_630_399_506_000)
        val second = Date(1_630_399_506_000)
        assertEquals(first, second)
    }

    @Test
    // Succeeds
    fun timestampEquals() {
        val first = Date(1_630_399_506_000)
        val second = Date(1_630_399_506_000)
        assertEquals(first.getTime(), second.getTime())
    }
}

JS 的 assertEquals 失败是因为(我猜)kotlin.js.Date class.

中缺少 equals() 运算符

关于如何使 assertEquals 在给定我们的用例的所有平台上工作的任何建议?我可以想象一个解决方法是引入一个 DateWrapper class 来包装 Date class 并手动实现 equals() ...但这需要使用重构我们的 public API 不确定这是否是最好的方法。所以非常欢迎任何帮助/建议。非常感谢!

assertEquals 将不起作用,因为您无法将 equals 方法添加到 kotlin.js.Date class - 它是 external function exposing Date API 并且所有比较都会以与在 JS 中相同的方式完成

刚看完这篇文章:

  • Compare two dates with JavaScript

要使其正常工作,您应该使用 getTime() 或在您编写时提供包装器 class 在测试中创建重载的 assertEquals 方法 class 或另一个 util 文件

fun assertEquals(d1: Date, d2: Date) {
    kotlin.test.assertEquals(d1.getTime(), d2.getTime())
}

然后你还需要注意进口