我参加了Odersky的Coursera Scala课程,我正在努力为"过滤器"编写单元测试。第2课中的函数(返回p保持的集合的子集)。我们做了一个Type别名Set = Int =>布尔。我设法以令人满意的功能方式编写函数,我可以清楚地看到它正常工作。我声称这是因为我可以使用提供的printSet函数来处理各种应用的预定义集和谓词,并看到预期的结果出现在控制台中。我知道我们的Type别名是说我们实际上只是定义了一个确定集合成员的规则,而不是集合本身。
我遇到的真正问题是我不熟练编写单元测试,我无法想象如何制作一个测试我的过滤器(s:Set,p:Int =>布尔)函数的断言。
我认为,部分问题是不知道如何比较两组。试图从字面上断言从"过滤器"等于定义的结果,我尝试过这样的事情:
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荣誉代码的范围内要求。即使是暗示我的脑袋也会受到深深的赏识。
答案 0 :(得分:2)
问题在于,当您致电List.toSet
时,您会收到 scala Set
(scala.collection.immutable.Set
),而不是您的 { {1}}:
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