স্ক্যালাল (পরীক্ষা) দিয়ে উদাহরণস্বরূপ চেক কিভাবে করবেন


101

আমি আমার জাভা প্রকল্পের মধ্যে স্কেলস্টেস্ট অন্তর্ভুক্ত করার চেষ্টা করছি; সমস্ত 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

উত্তর:


116

স্কালা জাভা নয়। স্কালার instanceofপরিবর্তে কেবল অপারেটর নেই এটির একটি প্যারামেট্রিক পদ্ধতি রয়েছে isInstanceOf[Type]

আপনি একটি স্ক্যালটেষ্ট ক্র্যাশ কোর্স দেখে উপভোগ করতে পারেন ।


6
ঠিক আছে, যে সত্যিই প্রশ্নের উত্তর দেয় না। টাইপ চেকের জন্য স্কেলএস্টে অন্তর্নির্মিত সমর্থন রয়েছে। @ মার্টিন-জি
মাসাগ

"টাইপ" এটি যদি একটি বৈশিষ্ট্য হয় তবে কীভাবে করবেন?
লোবো

যদি নিশ্চিত না আমি সঠিকভাবে বুঝি, কিন্তু এটি একই হওয়া উচিত: isInstanceOf[TraitName]
এগ্রিলস্টিল

92

স্কেলেটেস্ট ২.২.x (সম্ভবত এর আগেও) আপনি ব্যবহার করতে পারেন:

anInstance mustBe a[SomeClass]

4
এটি স্কেল টেস্টের সাম্প্রতিক সংস্করণগুলির প্রস্তাবিত পদ্ধতির
maasg

6
এছাড়াও উপলভ্য a[Type]যাতে আপনি ব্যাকরণগতভাবে সঠিক হতে পারেন;)
স্যামুয়েল

আমি যে খুঁজছিলাম! :)
আতাইস

23
tiger shouldBe a [Tiger]বর্তমান সিনট্যাক্স স্কেলএস্ট.আর.এ্যাট_এ_এলজেন্স
gedেগেডাস

4
@jhegedus mustBeযদি আপনি ব্যবহার এছাড়াও সঠিক, doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers আপনি FreeSpec জন্য চাই।
টবি

30

আপনি যদি কম JUnit-esque হতে চান এবং আপনি যদি স্ক্যালটেষ্টের ম্যাথারগুলি ব্যবহার করতে চান তবে আপনি নিজের সম্পত্তি সম্পর্কিত ম্যাচার লিখতে পারেন যা টাইপের (বারের ধরণের মুছে ফেলার) সাথে মেলে।

আমি এই থ্রেডটি বেশ কার্যকর বলে খুঁজে পেয়েছি: 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 এটি দেখতে অসাধারণ লাগছে এবং অ-প্রোগ্রামিং লোকদের জন্য এমনকি বোধগম্য (ধরে নেওয়াও যে তারা জানে যে উদাহরণটি কী :-))।
হেল্পারমেডোথ

সিনট্যাক্স চিনি যদি আপনার পরে থাকে তবে কিছু রিফ্যাক্টরিং সহ আপনি বাড়ি লিখতে সক্ষম হতে পারেন।উত্তরটি (তৈরি [ওফড]) হতে হবে বা হাউসডোর হতে হবে (বানানো থেকে [বাঁশ])।
গিলিয়াম বেলরোজ


17

IsInstanceOf [টাইপ] এবং জুনিট পরামর্শ সম্পর্কে বর্তমান উত্তরগুলি ভাল তবে আমি একটি জিনিস যুক্ত করতে চাই (এমন লোকদের জন্য যারা এই পৃষ্ঠায় অ-জুনিট-সম্পর্কিত ক্ষমতা অর্জন করেছেন)। অনেক ক্ষেত্রে স্কালার প্যাটার্নের মিল আপনার প্রয়োজন অনুসারে চলে। আমি এই ক্ষেত্রেগুলিতে এটির সুপারিশ করব কারণ এটি আপনাকে বিনামূল্যে টাইপকাস্টিং দেয় এবং ত্রুটির জন্য কম স্থান দেয়।

উদাহরণ:

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

স্কেলাটেষ্টে প্যাটার্ন ম্যাচটি পরীক্ষা করার প্রস্তাবিত উপায় হ'ল inside(foo)match foo ম্যাচের পরিবর্তে use দেখুন স্ক্যালেস্টেস্ট.আর.উউজার_গাইড
ধনী

3

গিলিয়ামের স্ক্যাল্যাটেস্ট আলোচনার রেফারেন্স (এবং জেমস মুরের সাথে যুক্ত অন্য একটি আলোচনা) দুটি পদ্ধতিতে একত্রীকরণ করা, স্কেলটেষ্ট ২.x এবং স্কেলা ২.১০ (ম্যানিফেস্টের পরিবর্তে ক্লাসট্যাগ ব্যবহার করার জন্য) আপডেট করা হয়েছে:

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

সংগ্রহগুলির সাথে দৃ as়তার জন্য আমি 2.11.8 ব্যবহার করি। নতুন সিনট্যাক্সটি নিম্নরূপ:

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

4
মুছে ফেলার কারণে আপনি Mapএর ধরণের পরামিতিগুলি পরীক্ষা করতে পারবেন না । আপনি যা লিখেছেন তা লেখার মতোই scores shouldBe a[Map[_, _]]। এটি এখানে উল্লেখ করা হয়েছে: scalatest.org/user_guide/used_matchers#checkingAnObjectsClass
সমৃদ্ধ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.