如何为"过滤器"写一个scala单元测试?功能?

时间:2014-05-17 05:57:05

标签: scala unit-testing

我参加了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荣誉代码的范围内要求。即使是暗示我的脑袋也会受到深深的赏识。

1 个答案:

答案 0 :(得分:2)

问题在于,当您致电List.toSet时,您会收到 scala Setscala.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