有没有一种很好的方法可以检查ScalaTest中的模式匹配是否成功?scalatest-users邮件列表中提供了一个选项:
<value> match {
case <pattern> =>
case obj => fail("Did not match: " + obj)
}
Run Code Online (Sandbox Code Playgroud)
但是,它没有组成(例如,如果我想断言列表的确切2个元素使用Inspectors API匹配模式).我可以编写一个匹配部分函数文字的匹配器,如果已定义则可以成功(如果我想在消息中获取模式,则必须是一个宏).还有更好的选择吗?
我不是100%确定我理解你问的问题,但一个可能的答案是在Inside trait中使用inside.鉴于:
case class Address(street: String, city: String, state: String, zip: String)
case class Name(first: String, middle: String, last: String)
case class Record(name: Name, address: Address, age: Int)
Run Code Online (Sandbox Code Playgroud)
你可以写:
inside (rec) { case Record(name, address, age) =>
inside (name) { case Name(first, middle, last) =>
first should be ("Sally")
middle should be ("Ann")
last should be ("Jones")
}
inside (address) { case Address(street, city, state, zip) =>
street should startWith ("25")
city should endWith ("Angeles")
state should equal ("CA")
zip should be ("12345")
}
age should be < 99
}
Run Code Online (Sandbox Code Playgroud)
这适用于断言或匹配器.详细信息:
http://www.scalatest.org/user_guide/other_goodies#inside
另一个选项如果您使用匹配器并且只想断言值与特定模式匹配,则可以只使用matchPattern语法:
val name = Name("Jane", "Q", "Programmer")
name should matchPattern { case Name("Jane", _, _) => }
Run Code Online (Sandbox Code Playgroud)
http://www.scalatest.org/user_guide/using_matchers#matchingAPattern
你指出的scalatest-users帖子是从2011年开始的.从那时起,我们为这个用例添加了上面的语法.
法案