我有一个简单的问题。在我的单元测试中,我将预期输出与实际输出比较为String值。现在,字符串的一部分是随机生成的唯一ID,导致测试每次都失败。有没有办法可以指定我的测试只匹配字符串中两点之间的部分实际和忽略文本。像 -
这样的函数def isMatch(expected : String, actual : String , ignoreFrom : String , ignoreTo : String)
另外,由于这是模式匹配的候选者,有人可以指出模式匹配/正则表达式用于Dummies类教程吗?
答案 0 :(得分:2)
我认为Scala extractors就是你想要的。您可以指定extractor以仅匹配字符串的特定部分。
以下是一些例子:
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")
}
}
“Scala编程”和“Scala in depth”在模式匹配方面有着惊人的例子。
答案 1 :(得分: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