ScalaTest में कस्टम विफलता संदेश कैसे दिखाएं?


86

क्या कोई जानता है कि ScalaTest में कस्टम विफलता संदेश कैसे दिखाया जाए?

उदाहरण के लिए:

NumberOfElements() should equal (5)

यह विफल होने पर निम्न संदेश दिखाता है:

10 नहीं के बराबर 5

लेकिन मुझे और अधिक वर्णनात्मक संदेश चाहिए जैसे:

नंबरऑफ़ेले 5 होना चाहिए।

जवाबों:


101

आप इस तरह की सुविधा के लिए पूछने वाले पहले व्यक्ति हैं। इसे प्राप्त करने का एक तरीका क्लीक्यू के साथ है। कुछ इस तरह:

withClue("NumberOfElements: ") { NumberOfElements() should be (5) }

आपको यह त्रुटि संदेश मिलना चाहिए:

NumberOfElements: 10 5 के बराबर नहीं था

यदि आप संदेश को पूरी तरह से नियंत्रित करना चाहते हैं तो आप एक कस्टम मैचर लिख सकते हैं। या आप इस तरह का उपयोग कर सकते हैं:

assert(NumberOfElements() == 5, "NumberOfElements should be 5")

क्या आप विस्तार से बता सकते हैं कि आपका उपयोग मामला क्या है? ऐसा क्यों है कि 10 बराबर नहीं था 5 सूंघने के लिए नहीं है, और आपको कितनी बार इसकी आवश्यकता है?

यहां आप जिस तरह का अनुरोध कर रहे हैं:

scala> import org.scalatest.matchers.ShouldMatchers._
import org.scalatest.matchers.ShouldMatchers._

scala> withClue ("Hi:") { 1 + 1 should equal (3) }
org.scalatest.TestFailedException: Hi: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)


scala> class AssertionHolder(f: => Any) {
     |   def withMessage(s: String) {
     |     withClue(s) { f }
     |   }
     | }
defined class AssertionHolder

scala> implicit def convertAssertion(f: => Any) = new AssertionHolder(f)
convertAssertion: (f: => Any)AssertionHolder

scala> { 1 + 1 should equal (3) } withMessage ("Ho:")
org.scalatest.TestFailedException: Ho: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)

तो इस तरह आप लिख सकते हैं:

{ NumberOfElements() should be (5) } withMessage ("NumberOfElements:")

1
ऐसी परिस्थितियाँ हैं जहाँ मुझे इसमें एक से अधिक दावे करने थे () परीक्षण और एक से अधिक पूर्णांक तुलना हैं। यह उन लॉग को देखकर स्पष्ट नहीं है जो दावे विफल हो गए हैं।
उदयकुमार रायला

लेकिन इसे निर्दिष्ट करने का तरीका ठीक नहीं है। क्या संदेश को अंत में निर्दिष्ट करने का कोई तरीका नहीं है?
उदयकुमार रायला

1
अंत में मिलानकर्ता के DSL के साथ उल्लेखनीय नहीं है, लेकिन आप एक विधि लिख सकते हैं जो विपरीत क्रम में withClue params डालता है। मैं उत्तर के लिए एक उदाहरण जोड़ूंगा।
बिल वेनर्स

12

2011 के बाद से नया तरीका: Matchersऔर AppendedClueलक्षण। साथ ही, संग्रह आकार के लिए, कुछ डिफ़ॉल्ट संदेश हैं।

import org.scalatest.{AppendedClues, Matchers, WordSpec}

class SomeTest extends WordSpec with Matchers with AppendedClues {

  "Clues" should {
    "not be appended" when {
      "assertions pass" in {
        "hi" should equal ("hi") withClue "Greetings scala tester!"
      }
    }
    "be appended" when {
      "assertions fail"  in {
        1 + 1 should equal (3) withClue ", not even for large values of 1!"
      }
    }
    "not be needed" when {
      "looking at collection sizes" in {
        val list = List(1, 2, 3)
        list should have size 5
      }
    }
  }
}

आउटपुट इस तरह दिखता है:

SomeTest:
Clues
  should not be appended
  - when assertions pass
  should be appended
  - when assertions fail *** FAILED ***
    2 did not equal 3, not even for large values of 1! (SomeTest.scala:15)
  should not be needed
  - when looking at collection sizes *** FAILED ***
    List(1, 2, 3) had size 3 instead of expected size 5 (SomeTest.scala:21)

ध्यान दें कि Listआकार संदेश लंबे .toStringआउटपुट के साथ सूचियों के लिए महान नहीं है ।

अधिक जानकारी के लिए स्केलडॉक देखें ।


3

आप withClueकुछ भी आयात किए बिना या परीक्षण वर्ग में शामिल किए बिना उपयोग कर सकते हैं :

withClue(s"Expecting distinct elements: ${elements.toList}") { elements.length shouldBe 3 }

यह Assertionsवर्ग से आयात किया जाता है :org.scalatest.Assertions#withClue

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.