2012-09-28 20 views
7

Ben, Salât (mongoDB bağlanma özelliğinin için) Çal 2 kullanarak bir web-app yazıyorum ile Salat dayalı yöntemler test etmek. Ders Modelinde bazı yöntemleri test etmek istiyorum (örneğin, doğru dersi id olarak aldığım gerçeğini test edin). Sorun şu ki, mevcut DB'mi kukla derslerle kirletmek istemiyorum. Salat ve Scala Testini kullanarak sahte bir DB'yi nasıl kullanabilirim? İşte benim test dosyamdan biri. İki ders oluşturur ve DB'ye ekler ve üzerinde bazı testler çalıştırır.ScalaTest

LessonSpec extends FlatSpec with ShouldMatchers { 
    object FakeApp extends FakeApplication() 

    val newLesson1 = Lesson(
    title = "lesson1", 
    level = 5, 
    explanations = "expl1", 
    questions = Seq.empty) 
    LessonDAO.insert(newLesson1) 

    val newLesson2 = Lesson(
    title = "lesson2", 
    level = 5, 
    explanations = "expl2", 
    questions = Seq.empty) 
    LessonDAO.insert(newLesson2) 

    "Lesson Model" should "be retrieved by level" in { 
    running(FakeApp) { 
     assert(Lesson.findByLevel(5).size === 2) 
    } 
    } 
    it should "be of size 0 if no lesson of the level is found" in { 
    running(FakeApp) { 
     Lesson.findByLevel(4) should be(Nil) 
    } 
    } 

    it should "be retrieved by title" in { 
    running(FakeApp) { 
     Lesson.findOneByTitle("lesson1") should be(Some(Lesson("lesson1", 5, "expl1", List()))) 
    } 
    } 

} 

Web'de arama yaptım ancak Salat ve ScalaTest'i kullanan iyi bir bağlantı veya proje bulamıyorum. Benim uygulamalarda

cevap

1

, ben Mongo veritabanı adını belirtmek için dosyasına koyarak bir parametresini kullanın. FakeApplication'ı başlatırken, bu parametreyi geçersiz kılar, böylece birim testlerim gerçek bir Mongo örneğini kullanabilir ancak üretim verilerimden hiçbirini göremez. Burada

// wipe any existing data 
db.collectionNames.foreach { colName => 
    if (colName != "system.indexes") db.getCollection(colName).drop 
} 

app = FakeApplication(additionalConfiguration = Map("mongo.db.name" -> "unit-test")) 
+0

Cevabınız için teşekkür ederiz, çok yardımcı oldu! Tek bir şey, mevcut verileri silmek için şu yöntemi kullanabilirsiniz: db.dropDatabase – TeaBough

2

Salat geliştirici: my uygulamaya özgü birkaç ayrıntıyla sayarlar

, benim testler şuna benzer. Benim tavsiyem ayrı bir test sadece veritabanı olması olacaktır. Test veritabanınızı bilinen bir duruma getirmek için test verileriyle doldurabilirsiniz - bunun nasıl yapılacağına dair casbah testlerine bakın ve ardından istediğiniz gibi test edin, gerektiğinde koleksiyonları temizleyin.

ben değil scalatest specs2 kullanır, ancak prensip aynıdır - salat testler için kaynak kodunu bakın.

İşte başlangıç ​​için iyi bir test var: https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

Not my baz spec içinde benim sınama veritabanı temizlemek olduğunu - bu, her spec önce koþulur: SalatDAOSpec sonra

trait SalatSpec extends Specification with Logging { 

    override def is = 
    Step { 
     //  log.info("beforeSpec: registering BSON conversion helpers") 
     com.mongodb.casbah.commons.conversions.scala.RegisterConversionHelpers() 
     com.mongodb.casbah.commons.conversions.scala.RegisterJodaTimeConversionHelpers() 

    }^
     super.is^
     Step { 
     //  log.info("afterSpec: dropping test MongoDB '%s'".format(SalatSpecDb)) 
     MongoConnection().dropDatabase(SalatSpecDb) 
     } 

Ve Testlerimi, bireysel koleksiyonları oluşturan, doldurup/çıkaran ve testlerin beklenen bir durumda çalışabilmesi için kapsamları içinde çalıştırıyorum. Bir aksama: Eğer testlerinizi aynı koleksiyonda eşzamanlı olarak çalıştırırsanız, beklenmedik durumdan dolayı başarısız olabilirler. Çözüm, testlerinizi yalıtılmış özel amaçlı koleksiyonlarda yürütmek veya testlerinizi seri halde çalışmaya zorlamaktır, böylece tek bir koleksiyondaki işlemler birbirini takip etmez, çünkü farklı test senaryoları koleksiyonu değiştirir. Eğer Scalatest posta listesine (http://groups.google.com/group/scalatest-users) için yayınlarsanız

, birisi bu ayarlamak için doğru yolu tavsiye eminim.