2013-10-11 41 views
1

我有一個足夠簡單的問題。在我的單元測試中,我將預期與實際輸出作爲字符串值進行比較。現在,字符串的一部分是隨機生成的唯一ID,這會導致測試每次都失敗。有沒有一種方法可以指定我的測試只匹配部分字符串中兩點之間的實際和忽略文本。像函數 -在Scala模式匹配過程中排除部分字符串

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

而且,因爲這是模式匹配的候選人,可能有人點我的模式匹配/正則表達式傻瓜樣的教程?

+0

訪問這個鏈接將是有益的給你[鏈接1](HTTP://scala-programming-language.1934581.n4.nabble。 com/Pattern-matching-on-strings-td1947939.html)[link2](http://johlrogge.wordpress.com/2008/10/06/scala-nugget-pattern-matching-a nd-lists /) – Engineer

+0

ignoreFrom是String還是Int? –

回答

2

我認爲斯卡拉extractors是你想要的。您可以指定提取器來僅匹配字符串的特定部分。

下面是一些例子:

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的在深度」對模式匹配驚人的例子。

0

我們創建了自定義匹配器來處理變量字符串,基本上使用正則表達式來表示測試的預期結果。這是有用的情況下是很多:像你的情況下,一個變量ID,不同的服務器的URL就像我們在質量保證線,日期,運行測試時...

你想要的是一些通用模式匹配器,

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 
+0

我們使用黃瓜進行測試,並且此資源對於簡單的正則表達式用法用於測試目的相當不錯。這是黃瓜相關,但給你一個好主意,如何匹配預期的投入:http://www.richardlawrence.info/2010/07/20/just-enough-regular-expressions-for-cucumber/ – maasg