2013-11-26 8 views
7

公式のPlayドキュメントのSpecs2を使用して、Scalaのテストの例に従ってきました。私は、彼らが次のようなclodeで、に対してテストするために偽のアプリケーションを起動するためにWithApplicationを使用していることに気づく:Play Famework 2 - Scala - テストスイート用のアプリケーションを1つ起動する

"something" should { 
    "do X" in new WithApplication { /* ... */ } 
    "do Y" in new WithApplication { /* ... */ } 
    "do Z" in new WithApplication { /* ... */ } 
} 

これは罰金と、すべてのですが、私がいる問題は、私はコストを負担ということですこれが起こるたびに私のアプリケーションが起動します。テストスイートが妥当なサイズになったら、これは必ずしも「高速」または少なくとも十分速くないとは限りません。

val app = FakeApplication() 
"something" should { 
    "do X" in new WithApplication(app) { /* ... */ } 
    "do Y" in new WithApplication(app) { /* ... */ } 
    "do Z" in new WithApplication(app) { /* ... */ } 
} 

"something" should { 
    val app = FakeApplication() 
    Helpers.running(app) { 
     "do X" in { /* ... */ } 
     "do Y" in { /* ... */ } 
     "do Z" in { /* ... */ } 
    } 
} 

最初は、最初のテストのために働くようだし、後でテストでDB接続の問題について文句を言う:私のようなことをやってみました。私は何かがここでシャットダウンされているか、何か(何が何であるかわからない)を推測しています。

実行中のアプリケーションが存在しないと不平を言うので、2番目の方法はまったく機能しません。

ご協力いただきまして誠にありがとうございます。ありがとう!

答えて

4

これは、テストする内容によって異なります。外部依存関係や依存関係がなく、モックやスタブアウトが可能な単体テストコードであれば(これを可能にするような方法でコードを構築することをお勧めします)、 WithApplicationを使用してください。これはおそらく最良のアプローチです。

アプリケーションを一度しか使用できないため、最初に提供したソリューションは機能しません。 WithApplicationはアプリケーションの起動と停止を行うため、動作してもパフォーマンス上のメリットはありません。

Helpers.running(app) { }コードブロックが実行されているときに、これが仕様を宣言するだけなので、2番目のソリューションは機能しません。スペックはこれらをすべてリストに入れて、実行中のブロックを終了してアプリケーションをシャットダウンします。その後、ある時点で仕様がテストを実行し、当然のアプリケーションはありません。

したがって、残りのアプリを分離してコードをテストできない場合は、実行中のアプリが必要です。これについて何もできません。統合テストの現実です。おそらく、各テストの間に起動と停止が必要な場合があります。そうしないと、テストはお互いに独立して実行されません。

3

古くなっていますが、私は答えを出します。私は同じ問題に直面していたので、同様の考えがありました。 SPEC2でやっぱ& BeforeAllの特徴は、私の解決策は基本的にあるので、多分それは、ポストの時点で存在しませんでした、あります:

package com.equipx.spec.util 

import org.specs2.specification.{AfterAll, BeforeAll} 
import play.Application 
import play.api.Play 
import play.test.{Helpers, FakeApplication} 

/** 
* @author Anton Oparin ([email protected]) 
*/ 
trait WithGlobalApplication extends BeforeAll with AfterAll { 

    protected var app: Application = null 

    /** 
    * Override this method to setup the application to use. 
    * 
    * By default this will call the old {@link #provideFakeApplication() provideFakeApplication} method. 
    * 
    * @return The application to use 
    */ 
    protected def provideApplication: Application = { 
    return provideFakeApplication 
    } 

    /** 
    * Old method - use the new {@link #provideApplication() provideApplication} method instead. 
    * 
    * Override this method to setup the fake application to use. 
    * 
    * @return The fake application to use 
    */ 
    protected def provideFakeApplication: FakeApplication = { 
    return Helpers.fakeApplication 
    } 

    override def beforeAll { 
    app = provideApplication 
    Helpers.start(app) 
    Play.current 
    } 

    override def afterAll { 
    if (app != null) { 
     Helpers.stop(app) 
     app = null 
    } 
    } 

} 

は基本的に私はWithApplicationの実装を取って、それがグローバルました。

関連する問題