स्केला (टेस्ट) के साथ एक इंस्टाफ़ॉल चेक कैसे करें


100

मैं अपने जावा प्रोजेक्ट में ScalaTest को शामिल करने की कोशिश कर रहा हूं; ScalaTests के साथ सभी JUnit परीक्षणों की जगह। एक बिंदु पर, मैं यह जांचना चाहता हूं कि क्या गिटार का इंजेक्टर सही प्रकार का इंजेक्शन लगाता है। जावा में, मेरे पास इस तरह का एक परीक्षण है:

public class InjectorBehaviour {
    @Test
    public void shouldInjectCorrectTypes() {
        Injector injector = Guice.createInjector(new ModuleImpl());
        House house = injector.getInstance(House.class);

        assertTrue(house.door() instanceof WoodenDoor);
        assertTrue(house.window() instanceof BambooWindow);
        assertTrue(house.roof() instanceof SlateRoof);
    }
}

लेकिन मुझे स्केलेस्ट के साथ ऐसा करने में समस्या है:

class InjectorSpec extends Spec {
    describe("An injector") {
        it("should inject the correct types") {
            val injector = Guice.createInjector(new ModuleImpl)
            val house = injector.getInstance(classOf[House])

            assert(house.door instanceof WoodenDoor)
            assert(house.window instanceof BambooWindow)
            assert(house.roof instanceof SlateRoof)
        }
    }
}

यह शिकायत करता है कि मान / / instanceofका सदस्य नहीं है । क्या मैं स्काला में उस तरह का उपयोग नहीं कर सकता हूं ?DoorWindowRoofinstanceof

जवाबों:


114

स्काला जावा नहीं है। स्काला में सिर्फ ऑपरेटर नहीं होता है, instanceofइसकी बजाय एक पैरामीट्रिक विधि होती है isInstanceOf[Type]

आपको स्कैलेस्ट क्रैश कोर्स देखने का भी आनंद मिल सकता है ।


6
खैर, यह वास्तव में सवाल का जवाब नहीं है। ScalaTest में टाइप चेक के लिए बिल्ट-इन सपोर्ट है। @ मार्टिन-जी
मास

यह कैसे करें यदि "टाइप" यह एक लक्षण है?
लोबो

सुनिश्चित नहीं हैं कि अगर मैं सही ढंग से समझ है, लेकिन यह एक ही होना चाहिए: isInstanceOf[TraitName]
अगिलस्टील

88

Scalatest 2.2.x के साथ (शायद पहले भी) आप उपयोग कर सकते हैं:

anInstance mustBe a[SomeClass]

4
यह स्कैलेस्ट्स के हाल के संस्करणों पर अनुशंसित दृष्टिकोण है
मास

6
उपलब्ध भी a[Type]ताकि आप व्याकरण की दृष्टि से सही हो;)
शमूएल

मैं उसी की तलाश में था! :)
Atais

22
tiger shouldBe a [Tiger]is the current syntax scalatest.org/at_a_glance/FlatSpec
jhegedus

2
@jhegedus mustBeभी सही है, यदि आप doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers का उपयोग करते हैं जो आप FreeSpec के लिए चाहते हैं।
तोबी

30

यदि आप JUnit-esque कम होना चाहते हैं और यदि आप ScalaTest के माचिस का उपयोग करना चाहते हैं, तो आप अपने स्वयं के गुण मिलान लिख सकते हैं जो कि प्रकार (बार प्रकार इरेज़र) के लिए मेल खाता है।

मुझे यह धागा काफी उपयोगी लगा: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea

इसके बाद आप इस तरह के दावे लिख सकते हैं:

house.door should be (anInstanceOf[WoodenDoor])

के बजाय

assert(house.door instanceof WoodenDoor)

+1 यह बहुत अच्छा लगता है, और गैर-प्रोग्रामिंग लोगों के लिए भी समझ में आता है (यह मानते हुए कि वे जानते हैं कि एक उदाहरण :-) क्या है)।
हेल्परमेथोड

यदि सिंटेक्स शुगर आप के बाद है, कुछ refactoring के साथ आप घर लिखने में सक्षम हो सकता है। (होना चाहिए [लकड़ी]) या house.door होना चाहिए (बनाया [बांस])।
गिलियूम बेल्रोस


16

IsstanceOf [प्रकार] और जूनट सलाह के बारे में वर्तमान उत्तर अच्छे हैं, लेकिन मैं एक बात जोड़ना चाहता हूं (ऐसे लोगों के लिए जो इस पृष्ठ पर गैर-जूनियर-संबंधित क्षमता में हैं)। कई मामलों में स्कैला पैटर्न का मिलान आपकी आवश्यकताओं के अनुरूप होगा। मैं उन मामलों में इसकी सिफारिश करूंगा क्योंकि यह आपको मुफ्त में टाइपकास्टिंग देता है और त्रुटि के लिए कम जगह छोड़ता है।

उदाहरण:

OuterType foo = blah
foo match {
  case subFoo : SubType => {
    subFoo.thingSubTypeDoes // no need to cast, use match variable
  }
  case subFoo => {
    // fallthrough code
  }
}

स्केलेस्ट में एक पैटर्न मैच का परीक्षण करने के लिए अनुशंसित तरीका inside(foo)`फू मैच) के बजाय उपयोग करना है। देखें scalatest.org/user_guide/using_matchers#matchingAPattern
समृद्ध दिन

3

Guillaume के ScalaTest चर्चा संदर्भ (और जेम्स मूर द्वारा लिंक की गई एक और चर्चा) को दो तरीकों से समेकित करते हुए, ScalaTest 2.x और Scala 2.10 के लिए अद्यतन किया गया (प्रकट के बजाय ClassTag का उपयोग करने के लिए):

import org.scalatest.matchers._
import scala.reflect._

def ofType[T:ClassTag] = BeMatcher { obj: Any =>
  val cls = classTag[T].runtimeClass
  MatchResult(
    obj.getClass == cls,
    obj.toString + " was not an instance of " + cls.toString,
    obj.toString + " was an instance of " + cls.toString
  )
}

def anInstanceOf[T:ClassTag] = BeMatcher { obj: Any =>
  val cls = classTag[T].runtimeClass
  MatchResult(
    cls.isAssignableFrom(obj.getClass),
    obj.getClass.toString + " was not assignable from " + cls.toString,
    obj.getClass.toString + " was assignable from " + cls.toString
  )
}

2

मैं संग्रह के साथ अभिकथन करने के लिए 2.11.8 का उपयोग करता हूं। नया सिंटैक्स इस प्रकार है:

val scores: Map[String, Int] = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
scores shouldBe a[Map[_, _]] 

3
मिटाने के कारण आप Map's प्रकार के मापदंडों की जाँच नहीं कर सकते । आपने जो लिखा है वही लिखना है scores shouldBe a[Map[_, _]]। यह यहाँ उल्लेख किया गया है: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass
रिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.