2012-06-21 3 views
4

내 테스트를 데이터베이스에 삽입하는 데 문제가 있습니다. 운이없는 몇 가지 접근법을 시도했습니다. FakeApplication 내에서 테스트를 실행할 때 Global.onStart가 실행되지 않는 것 같습니다. Play Framework 2.0 (스칼라)에 테스트 데이터를 삽입하려면 어떻게해야합니까?

object TestGlobal extends GlobalSettings { 
    val config = Map("global" -> "controllers.TestGlobal") 

    override def onStart(app: play.api.Application) = { 
    // load the data ... 
    } 
} 

그리고 내 테스트 코드에

:
private def fakeApp = FakeApplication(additionalConfiguration = (
    inMemoryDatabase().toSeq + 
    TestGlobal.config.toSeq 
).toMap, additionalPlugins = Seq("plugin.InsertTestDataPlugin")) 

은 그 때 나는 각각의 테스트에서 running(fakeApp)를 사용합니다.

plugin.InsertTestDataPlugin은 다른 시도 였지만 conf/play.plugins에 플러그인을 정의하지 않으면 작동하지 않았습니다.이 코드는 테스트 범위에서만 필요하므로 원하는 것은 아닙니다.

이들 중 일부는 작동해야합니까? 비슷한 옵션으로 성공한 사람이 있습니까?

+0

가 올바르게'''InsertTestDataPlugin''' 철자나요

:
def runWithTestDatabase[T](block: => T) { val fakeApp = FakeApplication(additionalConfiguration = inMemoryDatabase()) running(fakeApp) { ProjectRepositoryFake.insertTestDataIfEmpty() block } } 

그리고, 대신 running(FakeApplication()){ /* ... */}, 나는 이렇게? Google 검색은이 SO 문제 만 제기했기 때문입니다. – opyate

+0

그래, 플러그인 클래스를 확장하여 직접 플러그인을 만들었는데 :-) 주된 소스에서 사용될 때 작동하고 play.plugins에 추가되었습니다. 그것에는 onStart 메소드가 있습니다. 그러나 그것은 주요 출처 범위에 있어야했습니다. – Arve

답변

1

내가 다른 방법으로이 문제를 해결하기로 결정했습니다 : 너무 유사한 무언가를 비어 있어야 DB를 테스트에서 예를 들어, 당신은 메모리 내 사용하는 경우

class StuffTest extends FunSpec with ShouldMatchers with CommonFixtures { 
    describe("Stuff") { 
    it("should be found in the database") { 
     runWithTestDatabase {  // <--- *The interesting part of this example* 
     findStuff("bar").size must be(1); 
     } 
    } 
    } 
} 
1

Global.onStart는 애플리케이션이 시작될 때 (dev, prod, test) 어떤 모드에서 실행되어야합니다 (the wiki on how to use Global을 따르십시오).

그런 방법으로 DB 상태를 확인하고 채울 수 있습니다.

나는이 같은기구를 만들어 :

if(User.findAll.isEmpty) { //code taken from Play 2.0 samples 

     Seq(
     User("[email protected]", "Guillaume Bort", "secret"), 
     User("[email protected]", "Maxime Dantec", "secret"), 
     User("[email protected]", "Sadek Drobi", "secret"), 
     User("[email protected]", "Erwan Loisant", "secret") 
    ).foreach(User.create) 

    } 
+0

그렇다면 실행 (FakeApplication ("global"-> "path.to.my.Global"))은 테스트에서 아무런 효과가 없다는 뜻입니까? – Arve

+0

@Arve 잘 모르겠지만 스칼라 샘플 (zen 프로젝트)에서 볼 수 있듯이 다른 방법이 효과가 있다고 확신합니다. –

+0

Seems Global은이 작업을 수행 할 장소가 아니며 특히 다른 데이터베이스 내용을 원한다면 다른 테스트. 내가 어떻게 내 대답으로 해결했는지 보아라. – Arve

관련 문제