scala.sys.process:==无法按预期工作

时间:2014-07-11 11:35:28

标签: scala unit-testing process

我最近发现了scala.sys.process并开始玩它。

我试图为bash文件编写解析器,并且在编写单元测试时发现了==方法的奇怪行为。 (我知道我可以直接运行bash文件,但将其视为练习)。

import scala.sys.process._

def processFromFile(file: String) = {
    val in = Source.fromFile(file)
    val lines = in.getLines
    val commands = lines filterNot(_.startsWith("#"))

    def toProcessBuilder(commands: List[String]): ProcessBuilder = commands match {
        case a :: b :: l => a ### toProcessBuilder(b :: l)
        case a :: Nil => a
        case Nil => ""
    }

    toProcessBuilder(commands.toList)
}

这是我的单元测试:

test("the process parser works correctly") {
    val process = "ls" ### "git log"
    val processLoaded = Experiment.processFromFile("experiments/test.sh")
    assert(process == processLoaded)
}

" test.sh"文件仅包含:

#test
ls
git log

但单元测试失败,并带有以下代码:

[info] - the process parser works correctly *** FAILED ***
[info]   ( [ls] ### [git, log] )  did not equal  ( [ls] ### [git, log] )

对我来说,它看起来像进程和processLoaded是等于,如果我比较两个测试的_.toString是接受的。

那么这里发生了什么,为什么scala能够正确比较这两个对象?

1 个答案:

答案 0 :(得分:2)

对于ProcessBuilder(顺便说一句,不是具体类,但是接口),相等的含义可能不是那么直接,即使它在你的情况下似乎应该是相同的命令有相同的操作。

您获得的实现没有自定义的equals / hashcode,因此将继承默认对象equals,该对象基于对象标识进行比较。这意味着只有相同的实例才会与自身相同。

我会为测试框架创建一个特殊的比较器/匹配器,它与ProcessBuilder中的命令列表相匹配(例如,像toString所说的那样):