【问题标题】:How does one write a scala unit test for the "filter" function?如何为“过滤器”功能编写 Scala 单元测试?
【发布时间】:2014-07-05 15:56:29
【问题描述】:

我正在学习 Odersky 的 Coursera Scala 课程,我正在努力为第 2 课中的“过滤器”函数编写单元测试(返回 p 成立的 set 的子集)。我们创建了一个类型别名 Set = Int => Boolean。我设法以令人满意的功能方式编写函数,我可以清楚地看到它工作正常。我声称这是因为我可以将提供的 printSet 函数用于各种应用的预定义集合和谓词,并看到预期的结果出现在控制台中。我知道我们的 Type 别名是在说我们实际上只是在定义一个确定集合成员的规则,而不是集合本身。

我遇到的真正问题是我不擅长编写单元测试,而且我无法想象如何做出断言来测试我的过滤器(s:Set,p:Int => Boolean)函数。

我认为,部分问题在于不知道如何比较两组。试图从字面上断言从“过滤器”返回的子集等于定义的结果,我尝试了这样的事情:

val sampleSet = List(-1, 0, 1).toSet
val odd: Set = x => x % 2 != 0
val sampleResult = List(-1, 1).toSet
assert( filter(sampleSet, odd).equals(sampleResult) )  //nope, doesn't work.  Returns false.
assert( filter(sampleSet, odd) == sampleResult )       //no good either

如何简单地比较两组是否包含完全相同的值?我是不是太直白了?我当然感到非常愚蠢。

任何人都可以向我建议一种为此编写单元测试的方法吗?单元测试没有评分,而且我的功能已经正常工作,所以在我看来,这似乎在 Coursera 荣誉代码的范围内。即使是让我头脑清醒的提示也将不胜感激。

【问题讨论】:

    标签: scala unit-testing


    【解决方案1】:

    问题在于,当您调用 List.toSet 时,您会返回 scala Set (scala.collection.immutable.Set),而不是 您的 Set

    scala> val sampleResult = List(-1, 1).toSet
    sampleResult: scala.collection.immutable.Set[Int] = Set(-1, 1)
    

    由于您已将 filter 定义为返回您的 Set 类型的对象,而不是 scala.collection.immutable.Set,因此它们永远不会相等。

    为您的方法编写正确的测试有点棘手,因为您的Set 是一个可以将任何Int 作为输入的函数。由于断言每个可能的 Int 值是不切实际的,因此您最好只断言一些相关的输入:

    assert(false, filter(sampleSet, odd)(-2))
    assert(true,  filter(sampleSet, odd)(-1))
    assert(false, filter(sampleSet, odd)(0))
    ...
    

    【讨论】:

    • 太棒了,非常感谢。我不得不将它们写为 assert(filter(sampleSet,odd)(-2)),但这正是我需要看到的。如果我只是在 scala 工作表或 sbt 中完成这些,我会看到编译器语句并意识到这一点。来自美国印第安纳州的欢呼声。
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-03-21
    • 2018-12-15
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多