2014-12-03 10 views
9

Czy istnieje dobry sposób sprawdzenia, czy dopasowanie wzorca jest skuteczne w programie ScalaTest? Opcja jest podany w liście scalatest-users korespondencji:Zwięzły sposób potwierdzenia wartości odpowiada danemu schematowi w ScalaTest

<value> match { 
    case <pattern> => 
    case obj => fail("Did not match: " + obj) 
} 

Jednak nie komponować (np jeśli chcę twierdzić, że dokładnie 2 elementy listy pasuje do wzorca za pomocą inspektorów API). Mógłbym napisać matcher, który wykonałby literał funkcji częściowej i odniósłby sukces, gdyby został zdefiniowany (musiałby to być makro, jeśli chciałbym uzyskać wzór również w wiadomości). Czy istnieje lepsza alternatywa?

Odpowiedz

5

Nie jestem w 100% pewny, że rozumiem pytanie, które zadajesz, ale jedną z możliwych odpowiedzi jest użycie od wewnątrz cechy Inside. Biorąc pod uwagę:

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) 

Można napisać:

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 
} 

który pracuje dla obu twierdzeń lub dopasowujących. Szczegóły tutaj:

http://www.scalatest.org/user_guide/other_goodies#inside

Inną opcją jeśli używasz dopasowujących i po prostu chcą, aby twierdzić, że wartość pasuje do określonego wzorca, można tylko matchPattern składnię:

val name = Name("Jane", "Q", "Programmer") 
name should matchPattern { case Name("Jane", _, _) => } 

http://www.scalatest.org/user_guide/using_matchers#matchingAPattern

Wpis scalatest-users, o którym wspomniałeś, był z 2011 roku. Od tego czasu dodaliśmy powyższą składnię do tego zastosowania.

Rachunek

0

Może to nie być dokładnie to, czego potrzebujesz, ale możesz napisać swoje twierdzenie testowe, używając takiego idiomu.

import scala.util.{ Either, Left, Right } 
// Test class should extend org.scalatest.AppendedClues 

val result = value match { 
    case ExpectedPattern => Right("test passed") 
    case _ => Left("failure explained here") 
}) 
result shouldBe 'Right withClue(result.left.get) 

Podejście to wykorzystuje fakt, że Scala match wyników ekspresji w wartości.

Oto bardziej zwięzła wersja, która nie wymaga cechy AppendedClues lub przypisywania wyniku wyrażenia dopasowania do val.

(value match { 
    case ExpectedPattern => Right("ok") 
    case _ => Left("failure reason") 
}) shouldBe Right("ok") 
+0

Właściwie uważam, że jest gorszy od rozwiązania w pytaniu: niepowodzenie daje mniej użyteczną wiadomość. –

+0

To dobra uwaga. Ulepszyłem swoją odpowiedź, aby rozwiązać ten problem, ale to rozwiązanie może nie spełnić celu "zwięzłości". –

Powiązane problemy