【问题标题】:Is there a way to make equals (==) check on kotlin.js.Date object work?有没有办法让等于(==)检查 kotlin.js.Date 对象工作?
【发布时间】:2021-08-31 19:26:55
【问题描述】:

我想就我们在 Kotlin 多平台项目中尝试对特定于平台的 Date 类进行单元测试时遇到的问题寻求一些帮助/建议。

我们的 Kotlin 多平台库目标; JVMNativeJavaScript 并使用平台特定的 Date 类:

  • java.util.Date (JVM)
  • platform.Foundation.NSDate(本机)
  • kotlin.js.Date (JS)

通过预期/实际 Date 类公开,并在公共包中的公共域类中使用。例如:

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())
    }
}

由于(我猜)kotlin.js.Date 类中缺少 equals() 运算符,JS 的 assertEquals 失败。

对于如何使assertEquals 在我们的用例的所有平台上工作有什么建议吗?我可以想象一种解决方法可能是引入一个包装Date 类的DateWrapper 类并手动实现equals() ......但这需要使用重构我们的公共API,并且不确定这是否是最好的方法去。所以任何帮助/建议都非常受欢迎。非常感谢!

【问题讨论】:

    标签: unit-testing kotlin assertion kotlin-multiplatform kotlin-js


    【解决方案1】:

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

    请阅读这篇文章:

    要使其正常工作,您应该使用getTime() 或在您编写时提供包装类在您的测试类或其他实用程序文件中创建重载的 assertEquals 方法

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

    那么你需要注意进口

    【讨论】:

    • 作为选项重载 assertEquals 方法;好的。感谢您添加的建议和解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2010-11-30
    相关资源
    最近更新 更多