【问题标题】:ScalaTest: customized value output for predefined typeScalaTest:预定义类型的自定义值输出
【发布时间】:2015-06-30 22:14:25
【问题描述】:

说,我有这样的琐碎测试:

class Test extends FunSuite with Matchers {

  test("test") {
    val array = Array(
      Array(1, 1, 1),
      Array(2, 1, 3),
      Array(1, 4, 1)
    )

    array should equal (null)
  }

}

...失败为:

Array(Array(1, 1, 1), Array(2, 1, 3), Array(1, 4, 1)) did not equal null

我的array 代表游戏领域,我希望它打印在类似于以下内容的测试输出中:

1 1 1
2 1 3
1 4 1

...而不是:

Array(Array(1, 1, 1), Array(2, 1, 3), Array(1, 4, 1))

有没有办法在 ScalaTest 中做到这一点?

【问题讨论】:

  • 使用class GameField(field: Array[Array[Int]]) { override def toString = ... }而不是直接使用嵌套数组。
  • @sschaef 感谢您的建议,但这不是我的选择。包装字段数组是我不想要的复杂情况。

标签: scala scalatest


【解决方案1】:

使用的一个选项是 WithClue。像这样的

val a = Array( Array(1,2,3), Array(4,5,6),Array(7,8,9))
def p (x:Array[Array[Int]]) = x.foreach( x=> {x.foreach(print);println;} )
withClue(p(a) ) {a should equal (null)}

在我认为你会寻找覆盖匹配器之间。正如我所见,您接下来将比较 ArrayArray 与 ArrayArray,并且您可能会在比较失败的地方寻找非常具体的比较。

【讨论】:

    【解决方案2】:

    这很有趣。
    您可能会考虑使用额外的类和伴随对象在 should 之前包装数组。班级和同伴必须是这样的,他们不会使您的null 测试无效,但提供更漂亮的打印。例如:

    class ArrayPrettyPrinter(array : Array[Int]) {
       override def toString() : String = {
          // your pretty print implementation here
       }
    }
    
    object ArrayPrettyPrinter {
       def apply(array : Array[Int]) : ArrayPrettyPrinter = {
          if (array == null) return null
          return new ArrayPrettyPrinter(array)
       }
    }
    

    你的测试应该变成:

    class Test extends FunSuite with Matchers {
    
      test("test") {
        val array = Array(
          Array(1, 1, 1),
          Array(2, 1, 3),
          Array(1, 4, 1)
        )
    
        ArrayPrettyPrinter(array) should equal (null)
      }    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 2016-04-22
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多