如何在两个列表中使用ScalaTest"包含allOf"?

aka*_*ppi 10 scala scalatest

我正在寻找一个ScalaTest匹配器来检查列表是否包含所有需要的元素(在另一个列表中给出),但也可能是其他元素.

contain allOf 要求获得两个固定元素,由于某种原因,其余的作为varargs.

我可以做这样的解决方法,但它非常难看:

val list = List(1,2,3,4)
val wanted = List(1,2,3)
list should contain allOf ( wanted.head, wanted.tail.head, wanted.tail.tail  :_* )    // ugly workaround
Run Code Online (Sandbox Code Playgroud)

为了给列表作为匹配,有contain theSameElementsAs.但是,它不允许无关元素出现在探测值中(我认为).

所以:

  • 我错过了什么吗?
  • 为什么allOf声明必须在前面给出两个固定元素(即为什么不通过varargs?)
  • 应该有theSameElementsAndMaybeMoreThan方法(可能有更好的名字)?

我试过的一些代码:

val list = List.empty[String]
//list should contain allOf("a")         // does not compile
list should contain allOf("a","b")
list should contain allOf("a","b","c")

val wanted = List("a","b","c")
//list should contain allOf( wanted )    // does not compile
list should contain allOf( wanted.head, wanted.tail )   // compiles, but tests the wrong thing; against List(head,List(tail))
Run Code Online (Sandbox Code Playgroud)

文件:

Scala 2.11.4,ScalaTest 2.2.1

编辑:

我可能最终使用类似的东西:

wanted.foreach( list should contain(_) )
Run Code Online (Sandbox Code Playgroud)

但是,对于我来说,这似乎并不像should内置的集合构造那样可读.

aka*_*ppi 8

Bill Venners 在 ScalaTest 邮件列表中有这样的说法:

是的,我们不想在 2.0 版本中添加它,但后来添加了它。我相信我们将它添加到 master 分支,而不是 2.2.x 分支。无论如何,语法如下所示:

xSet should contain allElementsOf (ySet)

链接到消息