0

テスト目的でモックする必要があるデータベースにアクセスする関数がいくつかあります。

使いやすくするために、これらの関数を別の関数内で定義したいと思います。この関数では、スコープを利用して、渡す必要がある引数の数を減らすことができます。

ネストされた関数をモックしながら、親関数をテストする必要があります。

ネストされた関数をモックするトリックはありますか?

二次的な質問として、任意の深さでネストされたときに関数をモックする方法はありますか?

補足: 私のプロジェクトは十分に軽いので、古典的なモッキングを使用することさえありませ。しかし、この質問については、どんな種類のあざけりでもかまいません。

非常に単純なコード例を次に示します。

class Storage {
  def storeData(specId: Long, data: String): Unit = {
    val rawPath = "/path/to/file"

    def storeFsEntry: Unit = {
      // do stuff
    }

    def storeDbEntry: Unit = {
      // do stuff we need mocked
    }

    if ( specId == 1 )
    {
      storeDbEntry
      storeFsEntry
    }
  }
}
4

1 に答える 1

0

不可能ですが、特性を定義して関数内に実装できます (このロジックを内部に実装したい場合)。

class Storage {

    trait Storing {
         def path: String //you have to define all free members
         def storeDbEntry: Unit
         def storeFsEntry: Unit
    }

    def storeData(specId: Long, data: String, storingDefault: Option[Storing] = None): Unit = {

       val myStoring = new Storing {
          ...implement it here
       }

       val storing = storingDefault getOrElse myStoring 
       import storing._

       if ( specId == 1 ) {
           storeDbEntry
           storeFsEntry
       }
    }
}

あなたのモックは次のようになります。

trait StorageMock extends Storage {

    override def storeData(specId: Long, data: String, storingDefault: Option[Storing] = None): Unit = {
        val storingOverride = new Storing { ... } //mocking functionality    
        super.storeData(specId, data, storingDefault orElse Some(storingOverride))
    }

}

new Storage with StorageMock

関数パラメーターの代わりに、storageDefault をメンバーに変更することもできます。

内部関数に対して同じことができない理由は、それらがプライベートであり、型チェックを実行できないためです (内部トレイトと比較して)。

于 2014-11-03T18:11:39.160 に答える