2016-06-17 3 views
0

私はscalaを使っていくつかのCRUD関数を作成しました。単体テストを使ってそれらをテストしたいと思います。たとえば、sendメソッドをテストしたいとします。ScalaTestを使ったPlayframework単体テストのCRUD関数

class MyFunctionDAO @Inject() (db: DB) { 

    def collection: JSONCollection = db.collection[JSONCollection]("myCollection") 

    def save(myObject: MyObject): Future[Either[String, UUID]] = { 
    collection.insert(myObject).map { 
     case result if result.ok == true => Right(myObject._id) 
     case result => Left(result.message) 
    } 
    } 
} 

どうすればいいですか?どのような例をお願いしますか?

答えて

1

ScalaMockを使用してdbインスタンスをモックし、期待値と戻り値を設定できます。それについてScalaTestの文書にpageがあります。たとえば以下の

はアプローチを説明し、私は確かに、テストに比較的新しいですが、それは偽造されていますように私は私の意見を共有するだろう問題

import org.scalatest.FlatSpec 
import org.scalamock.scalatest.MockFactory 

class MyFunctionDAOSpec extends FlatSpec with MockFactory { 
    val db = mock[DB] 
    val col = mock[JSONCollection] 
    (col.insert _) expects (myObj) returning (okResult) 
    (col.insert _) expects (myObj2) returning (failResult) 
    (db.collection _) expects ("myCollection") returning (col) 
    //... 

    val dao = new MyFunctionDAO(db) 

    "DAO" should "return Right" in { 
    dao.save(myObj) should be (Right(myObj._id)) 
    } 

    it should "return Left" in { 
    dao.save(myObj2) should be (Left("my error message")) 
    } 
} 
+0

ありがとう – Rajeun

0

を有することができます。 CRUD操作をユニットテストしてはならないと私は認識しています。代わりに統合テストを行う必要があります。 APIメソッドを単体テストするときに、そのメソッドがその契約に従うことをテストしようとしているからです。しかし、正確には、「このメソッドは、これらのプロパティを持つこのエンティティをDBに追加する必要があります」とはどういう意味ですか?たとえば、このメソッドには、入ってくるDTOを解析し、それをDBエンティティ/関係/ etcに変換するロジックが含まれています。変換の期待される結果をテストするべきではありません。なぜなら、メソッドは「どのように」動作するのではなく、「何を」実行するのかということです。さらに、この全体のロジックは、DBモデルを使用し、他のモデルではなく、CRUD操作自体とは関係がないため、必要です。

しかし、変換論理をテストしないでください。特に、それほど簡単ではない場合は、特に注意してください。実際にxを書くことを実際に試みるためにwrite(x)= f(convert(x))をテストするのではなく、convert(x)を実装のプライベートな部分にする(テストからスキップする)ので、単体テストf() - 統合テストのままにしておき、直接変換(x)する。

+0

さらに別の議論を追加しましょう。私たちはwrite(x)= db_write(convert(x))を定義しますが、write(x)の単体テストをどのように仮定しますか? Convert(x)は範囲外です - このテストでは、テストされていないことを嘲笑される可能性のあるものと考えています.db_writeもライブラリの機能の一部ですから範囲外です。 –

関連する問題