【问题标题】:Specs2: How to Test if "abc" contains all of "aabb"Specs2:如何测试“abc”是否包含所有“aabb”
【发布时间】:2013-11-02 12:34:46
【问题描述】:

Specs2 确实提供了一个 containsAllOf 匹配器,但我无法让它按照我想要的方式工作。我有两个字符串 A 和 B,我想测试 B 中出现的所有字符是否都存在于 A 中。

到目前为止我最好的尝试是

A.toCharArray.toSeq must containAllOf(B.toCharArray.toSeq)

但这会失败并出现类似的错误

WrappedArray(a, b, c, d, ...) 不包含 S, a, V, H, I, ... 和 不得包含...

  1. WrappedArray 确实包含据称根据 Specs2 不包含的字符
  2. 为什么要对 A 必须包含的元素进行测试?我不想测试相等性,我想测试 B 是否是 A 的“子集”(但不是在集合的严格集合论定义中)

如何为这种情况编写工作规范?

【问题讨论】:

  • 尝试A.toSet must containAllOf(B.toSet) - 在字符串上调用toSet 将返回字符串中(唯一)Chars 的集合。
  • 这不会编译,A.toSet.toSeq 等会通过测试 - 但是这并不能解释为什么上述方法不起作用,什么时候(在我看来)它完全应该:? containAllOf 这个名字显然并不意味着它们必须只包含一次,并且左侧不允许包含比右侧更多的字符...
  • 嗯,如果第一个序列在某处包含整个第二个序列,containAllOf 似乎返回 true,连续且按顺序排列。这不是Set 比较,而是Seq 比较。这意味着 A.toSet.toSeq 对于某些输入也可能会失败(例如,try B = "bbaa"),除非首先对生成的 Seqs 进行排序(A.toSet.toSeq.sorted 等)。
  • 您使用的是哪个版本?可以试试 2.3.1 和 'contain(allOf(B.toSeq:_*))' 吗?
  • 我使用的是 2.3.1,不幸的是你的建议显示了完全相同的症状

标签: unit-testing scala specs2


【解决方案1】:

这不使用 containsAllOf 但应该可以工作:

/* turn A into a Map for quick contains lookup */
val theAs = A.map(x=> (x,x)).toMap

/* if resulting list has length greater than 0, 
 * then there is something in A that is not in B*/
B.filterNot(theAs.contains).length must === 0

【讨论】:

  • 感谢您的建议,这当然是有效的。但对我来说,对于表达如此简单情况的测试用例来说,这有点过于逻辑了;)
  • 不用担心 :) 我希望这仍然对某人有所帮助。
【解决方案2】:

目前,我选择了这个变体:

B.toSeq.map(c => A must contain(c))

我仍然愿意接受建议,但如果没有更清洁的解决方案,我可能(第一次)回答我自己的问题。

或者这是我怀疑 Specs2 测试某事物的情况之一,而实际上它并没有?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多