2

さまざまなライブラリをインポートし、ソースの用途 (実行とテストなど) に応じて少し異なることを行う必要があります。

本番用に次のようなさまざまなソース ファイルがあるとします。

import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

case class SomeBusinessObject(...)

テストのために次のように変更する良い方法は何ですか (つまり、テスト中に別のデータベースを使用したいということです):

import scala.slick.driver.h2.simple._
import Database.threadLocalSession

case class SomeBusinessObject(...)

ああ、それから、私が使用しているデータベースへのキーを保持するデータベース クラスもあります。

import scala.slick.driver.PostgresDriver.simple._

// Use the implicit threadLocalSession
import Database.threadLocalSession

object DB{

  val get = {
      Database.forURL("jdbc:postgresql:test:slick",
                           driver="org.postgresql.Driver",
                           user="postgres",
                           password="xxxx") 
  }
}

私はいくつかの調査を行いました.Cakeパターンがこのタイプの鍵を握っているように見えますが、誰かが私を始めることができれば素晴らしいでしょう.

アップデート:

この質問をしてから、Slick の例で探していたものを正確に見つけました。本当にすっきりと引き立ちます!数週間前に例を調べましたが、これがどこで行われたか思い出せませんでした。

4

1 に答える 1

1

scala では、(ルート レベルだけでなく) クラス、オブジェクト、またはトレイトにネストされた "import" を使用できるという事実に基づいて構築できます。

scala.collection.mutable.Map と scala.collection.immutable.Map を使用した例 (不変バージョンの Map をテストで使用し、可変バージョンを Production で使用したいとします)

scala> trait Import1 {
     | import scala.collection.mutable.{Map => iMap}
     | def Test = iMap(1 -> "a")
     | }
defined trait Import1

scala> trait Import2 {
     | import scala.collection.immutable.{Map => iMap}
     | def Test = iMap(1 -> "a")
     | }
defined trait Import2

今、あなたはできる:

scala> object ProductionThing extends Import1
defined module ProductionThing

scala> ProductionThing.Test
res6: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> a)

scala> object TestingThing extends Import2
defined module TestingThing

scala> TestingThing.Test
res7: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> a)

または、同じメカニズムを使用してインポートの範囲をクラス内に限定し、そのクラスを SomeBusinessObject に注入することもできます。

于 2012-11-05T16:51:09.780 に答える