वहाँ अपने प्रश्न का 2 भागों हैं: मध्यस्थ राज्य भंडारण, और उदाहरण रोक जब एक विफल हो रहा है के लिए वार्स का उपयोग कर।
1 - का उपयोग करना वार्स
वहाँ
जब एक अस्थायी विनिर्देश का उपयोग कर वार्स का उपयोग कर के लिए कुछ विकल्प हैं।
आप अपने प्रक्रिया के चरणों का प्रतिनिधित्व lazy vals
उपयोग कर सकते हैं:
object DatabaseSpec extends mutable.Specification {
sequential
"The Data Access Object" should {
lazy val id1 = database.save(Entity(1))
lazy val loaded = database.load(id1)
lazy val list = database.list
"save an object" >> { id1 === 1 }
"load one object" >> { loaded.id === id1 }
"list all objects" >> { list === Seq(Entity(id1)) }
}
object database {
def save(e: Entity) = e.id
def load(id: Int) = Entity(id)
def list = Seq(Entity(1))
}
case class Entity(id: Int)
}
के बाद से उन मूल्यों को आलसी हैं, वे केवल जब उदाहरण क्रियान्वित कर रहे हैं बुलाया जाएगा।
आप अपने वर्तमान विनिर्देश की संरचना आप भी एक उदाहरण में नवीनतम 1.12.3-स्नैपशॉट और समूह के सभी उन छोटे उम्मीदों उपयोग कर सकते हैं बदलने के लिए तैयार कर रहे हैं:
"The Data Access Object provides a save/load/list api to the database" >> {
lazy val id1 = database.save(Entity(1))
lazy val loaded = database.load(id1)
lazy val list = database.list
"an object can be saved" ==> { id1 === 1 }
"an object can be loaded" ==> { loaded.id === id1 }
"the list of all objects can be retrieved" ==> {
list === Seq(Entity(id1))
}
}
तो उन अपेक्षाओं के किसी भी तो असफल बाकी निष्पादित नहीं किया जाएगा और आप की तरह एक विफलता संदेश प्राप्त होगा:
x The Data Access Object provides a save/load/list api to the database
an object can not be saved because '1' is not equal to '2' (DatabaseSpec.scala:16)
एक और संभावना है, जो 2 छोटे सुधार की आवश्यकता होगी, हो सकता है "फेंका" expectati का उपयोग कर विनिर्देशों लेखन के Given/When/Then रास्ता लेकिन उपयोग करने के लिए Given
और When
चरणों के अंदर ऑन्स। आप उपयोगकर्ता गाइड में देख सकते हैं, Given/When/Then
चरणों तार से डेटा निकालने और अगले Given/When/Then
के लिए लिखा था जानकारी पास:
import org.specs2._
import specification._
import matcher.ThrownExpectations
class DatabaseSpec extends Specification with ThrownExpectations { def is =
"The Data Access Object should"^
"save an object" ^save^
"load one object" ^load^
"list all objects" ^list^
end
val save: Given[Int] = groupAs(".*") and { (s: String) =>
database.save(Entity(1)) === 1
1
}
val load: When[Int, Int] = groupAs(".*") and { (id: Int) => (s: String) =>
val e = database.load(id)
e.id === 1
e.id
}
val list: Then[Int] = groupAs(".*") then { (id: Int) => (s: String) =>
val es = database.list
es must have size(1)
es.head.id === id
}
}
सुधार है, जो मैं करने जा रहा हूं, कर रहे हैं:
- असफलताओं के रूप में रिपोर्ट करने के लिए विफलता अपवाद अपवाद और त्रुटियों
- स्ट्रिंग विवरण से निकालने के लिए कुछ भी नहीं होने पर
groupAs(".*") and
का उपयोग करने की आवश्यकता को हटा दें।
उस मामले में यह लिखने के लिए पर्याप्त होना चाहिए:
val save: Given[Int] = groupAs(".*") and { (s: String) =>
database.save(Entity(1)) === 1
1
}
एक और संभावना सीधे लिखने के लिए अनुमति देने के लिए किया जाएगा:
val save: Given[Int] = groupAs(".*") and { (s: String) =>
database.save(Entity(1)) === 1
}
जहां एक Given[T]
वस्तु एक String => MatchResult[T]
से बनाया जा सकता क्योंकि MatchResult[T]
ऑब्जेक्ट में पहले से ही T
का मान है, जो "दिया गया" बन जाएगा।
2 - एक असफल उदाहरण
का उपयोग निहित WhenFail
Around
संदर्भ निश्चित रूप से आप क्या चाहते हैं (जब तक आप उम्मीदों विवरण के रूप में जी/डब्ल्यू/टी ऊपर दिखाए गए के साथ जाने क्या करने के लिए सबसे अच्छा तरीका है के बाद निष्पादन बंद करो उदाहरण)।
निम्न उदाहरण में दखल अगर समवर्ती उदाहरण के पिछले ब्लॉक में एक उदाहरण विफल रही द्वारा step(stepOnFail = true)
step(stepOnFail = true)
कार्यों पर ध्यान दें। हालांकि, जब आप sequential
का उपयोग कर रहे हैं, तो पिछला ब्लॉक केवल एक उदाहरण तक ही सीमित है। इसलिए आप क्या देख रहे हैं। असल में मुझे लगता है कि यह एक बग है और शेष सभी उदाहरण निष्पादित नहीं किए जाने चाहिए, भले ही आप क्रमिक उपयोग कर रहे हों या नहीं। इसलिए इस हफ्ते के अंत में आने वाले फिक्स के लिए ट्यून करें।
बीटीडब्ल्यू specs2 3.x को इस सटीक समस्या को हल करने के लिए डिज़ाइन किया गया है, जहां आप पिछले परीक्षणों के परिणामों पर निर्भर मनमाने ढंग से परीक्षण कर सकते हैं। यहां देखें: https://etorreborre.github.io/specs2/guide/SPECS2-3.1.1/org.specs2.guide.CreateOnlineSpecifications.html – Eric