Scala ile örnek denetimi nasıl yapılır (Test)


100

ScalaTest'i Java projeme dahil etmeye çalışıyorum; tüm JUnit testlerini ScalaTests ile değiştirme. Bir noktada, Guice's Injector'ın doğru türü enjekte edip etmediğini kontrol etmek istiyorum. Java'da şöyle bir testim var:

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);
    }
}

Ama ScalaTest ile aynı şeyi yapmakta sorun yaşıyorum:

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)
        }
    }
}

Değerin / / instanceofüyesi olmadığından şikayet ediyor . Scala'da bu şekilde kullanamaz mıyım?DoorWindowRoofinstanceof

Yanıtlar:


115

Scala, Java değildir. Scala sadece operatöre sahip değildir, instanceofbunun yerine parametrik bir metodu vardır isInstanceOf[Type].

Ayrıca bir ScalaTest Hızlandırma Kursu izlemekten de keyif alabilirsiniz .


6
pekala, bu soruya gerçekten cevap vermiyor. ScalaTest, tür denetimi için yerleşik desteğe sahiptir. @ Martin-g'den gelen yanıtı görün
maasg

"Yazmak" bir özellikse nasıl yapılır?
Lobo

Emin değilim doğru anlamak, ancak aynı olmalıdır eğer: isInstanceOf[TraitName].
agilesteel

89

Scalatest 2.2.x ile (belki daha da erken) şunları kullanabilirsiniz:

anInstance mustBe a[SomeClass]

4
Bu, ScalaTests'in son sürümlerinde önerilen yaklaşımdır
maasg

6
a[Type]dilbilgisi açısından doğru olabilmeniz için de mevcuttur ;)
Samuel

Ben onu arıyordum! :)
Atais

22
tiger shouldBe a [Tiger]geçerli sözdizimi scalatest.org/at_a_glance/FlatSpec
jhegedus

2
FreeSpec mustBeiçin istediğiniz doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers kullanıyorsanız @jhegedus da doğrudur.
Tobi

30

Daha az JUnit-esque olmak istiyorsanız ve ScalaTest'in eşleştiricilerini kullanmak istiyorsanız, tür (çubuk tipi silme) ile eşleşen kendi özellik eşleştiricinizi yazabilirsiniz.

Bu ileti dizisini oldukça yararlı buldum: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea

Daha sonra aşağıdaki gibi iddialar yazabilirsiniz:

house.door should be (anInstanceOf[WoodenDoor])

onun yerine

assert(house.door instanceof WoodenDoor)

+1 Bu çok güzel görünüyor ve programlamayan kişiler için bile anlaşılabilir (bir örneğin ne olduğunu bildiklerini varsayarak :-)).
helpermethod

Sözdizimi şekeri peşinde olduğunuz şeyse, biraz yeniden düzenleme ile house.door yazabilir (madeOf [Wood]) veya house.door (madeOf [Bamboo]) olmalıdır.
Guillaume Belrose


16

İsInstanceOf [Type] ve junit tavsiyesi hakkındaki mevcut cevaplar iyi ama bir şey eklemek istiyorum (bu sayfaya junit ile ilgili olmayan bir kapasiteyle gelen kişiler için). Çoğu durumda, ölçek düzeni eşleştirme ihtiyaçlarınızı karşılayacaktır. Bu gibi durumlarda tavsiye ederim çünkü size ücretsiz olarak tip dökümünü veriyor ve hata için daha az yer bırakıyor.

Misal:

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

ScalaTest'te bir kalıp eşleşmesini test etmenin önerilen yolu inside(foo), `foo match yerine kullanmaktır . Bkz scalatest.org/user_guide/using_matchers#matchingAPattern
Zengin Dougherty

3

Guillaume'un ScalaTest tartışma referansını (ve James Moore tarafından bağlanan başka bir tartışma), ScalaTest 2.x ve Scala 2.10 için güncellenen iki yöntemde birleştirmek (manifesto yerine ClassTag kullanmak için):

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
  )
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.