1

Planex例として、 .plan ファイルの文字列を分解して元に戻す単純な抽出プログラム があります。その動作をかなり徹底的に定義するいくつかの単体テストがあります。抽出器は次のとおりです。

object Planex {
  def apply(metadata: String, plan: String) = {
    String.format("%1$sPlan:\n%2$s", metadata, plan)
  }
  def unapply(str: String) = {
    val ixPlanLabel = str indexOf "Plan:"
    when(ixPlanLabel>=0) {
      (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim)
    }
  }
}

私はActorこれを使用するを持っています。

class PlanRepo(env: {
  val jsonFormats: Formats
  val load: () => String
  val planTarget: String => Unit
}) extends Actor {
  implicit val jsonFormats = env.jsonFormats
  def receive = {
    case (metaData: String, plan: Plan) => {
      val s = Planex(metaData,write(plan))
      env.planTarget(s)
    }
    case r: PlanRequest => {
      val Planex(metaData, planStr) = env.load()
      self.channel ! (metaData, read[Plan](planStr))
    }
  }
}

PlanRepo でのテストから、. を除くすべての依存関係を渡すことができましたPlanex。そのために、私はまだ具体的な抽出オブジェクトを使用しています。したがって、私のレポテストは、実際には、個別にテストされた の動作もテストしていPlanexます。これを回避する方法はありますか?

このドキュメントのjson部分の階層を定義するネストされたケースクラスのセットで同様の問題があります-それらを互いに分離するのに問題があります。

4

1 に答える 1

2

エクストラクタをトレイトで定義し、Planex直接実装する代わりにそのトレイトを拡張します。

trait PlanexExtractor {
  def apply(metadata: String, plan: String) = {
    String.format("%1$sPlan:\n%2$s", metadata, plan)
  }
  def unapply(str: String) = {
    val ixPlanLabel = str indexOf "Plan:"
    when(ixPlanLabel>=0) {
      (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim)
    }
  }
}

object Planex extends PlanexExtractor

または、必要に応じて、特性でインターフェイスを定義し、その特性を拡張するオブジェクトでそれを実装します。

trait PlanexAPI {
  def apply(metadata: String, plan: String): String
  def unapply(str: String): Option[String]
  }
}

object Planex extends PlanexAPI {
  def apply(metadata: String, plan: String) = {
    String.format("%1$sPlan:\n%2$s", metadata, plan)
  }
  def unapply(str: String) = {
    val ixPlanLabel = str indexOf "Plan:"
    when(ixPlanLabel>=0) {
      (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim)
    }
  }
}
于 2011-08-13T15:47:20.850 に答える