1

我有一个很简单的问题。在我的单元测试中,我将预期输出与实际输出作为字符串值进行比较。现在,字符串的一部分是随机生成的唯一 ID,这会导致测试每次都失败。有没有一种方法可以指定我的测试只匹配部分实际文本并忽略字符串中两点之间的文本。像 -

def isMatch(expected : String, actual : String , ignoreFrom : String , ignoreTo : String)

此外,由于这是模式匹配的候选者,有人可以指出我的模式匹配/正则表达式傻瓜类的教程吗?

4

2 回答 2

2

我认为 Scala提取器是您想要的。您可以指定提取器以仅匹配字符串的特定部分。

下面是一些例子:

object IgnoreBetween {
    def unapply(str: String): Option[(String, String)] = {
        val parts = str split "\\."
        if (parts.length == 3){
            Some(parts(0), parts(2))
        }else{
            None
        }
    }
}

object Main extends App {
    "part1.somerandom.part2" match {
        case IgnoreBetween("part1", "part2") => println("matches")
        case _ => println("doesn't match")
    }
}

“Programming in Scala”和“Scala in depth”在模式匹配方面有惊人的例子。

于 2013-10-11T09:08:41.273 回答
0

我们创建了自定义匹配器来处理可变字符串,基本上使用正则表达式来表达测试的预期结果。这很有用的情况很多:变量ID,例如您的情况,不同的服务器URL,例如我们在QA行中运行测试时,日期,...

您想要的是一些通用模式匹配器,例如:

def matches(expected : String, actual : String) = {
    val pattern = expected.r.pattern
    pattern.matcher(actual).matches
}

示例用法(在 REPL 上):

scala> matches("user id='(.+)' retrieved", "user id='12345' retrieved")
res1: Boolean = true

scala> matches("user id='(.+)' retrieved", "user id='12345' not found")
res2: Boolean = false
于 2013-10-11T10:23:45.130 回答