2012-10-10 2 views
0

컨트롤러의 공용 정적 메서드가 동일한 컨트롤러의 다른 정적 메서드를 명시 적으로 호출 할 때 (Java 호출 사용) Play!은 기능 테스트에서 코드를 실행하거나 리디렉션하는 것을 모릅니다.기능 테스트에서 다른 컨트롤러 내에서 컨트롤러 메서드를 호출하는 것이 이상하게 동작합니다

내가있는 경우 :

public class ApplicationTest extends FunctionalTest { 
    @Test 
    public void testProvesThatFunctionalTestsDoesntCallControllerMethods() { 
     Response response = GET("/"); 

     assertEquals("", getContent(response)); 
    } 

    @Test 
    public void testProvesThatCallingItDirectlyWorksAsExpected() throws Exception { 
     Response response = GET("/another"); 

     assertEquals("ok!", getContent(response)); 

    } 

} 

과 :

public class Application extends Controller { 
    public static void index() { 
     another(); 
    } 

    public static void another() { 
     renderText("ok!"); 
    } 
} 

하지만 플레이 실행을 실행하면 또는 플레이 "/"내 웹 브라우저에서 다음 반환를 시작하고 전화 " 알았어! ", FunctionalTest 정확히 실제 서버에서 실행되는 것처럼 작동하지 않습니까? 그것은 기능 테스트를 피하거나 미리 실행중인 웹 서버의 거대한 수동 설치 및 종속성을 갖기 위해 나를 밀어 붙입니다. 사전에

감사합니다.

답변

1

브라우저에서 "/"를 호출하면 "ok"를 반환하지만 첫 번째 응답에서는 그렇지 않습니다. 먼저 리디렉션 (302)을 반환 한 다음 200 (ok)을 반환합니다. 당신의 기능 테스트에서

, 그것은 당신이 당신 말이 맞아

Response response = GET("/"); 
assertStatus(302, response); 
response = GET(response.headers.get("Location").value()) 
assertIsOk(response); 
assertEquals("ok!", getContent(response)); 
+0

처럼 뭔가를해야, 동일하지만 나는 그것이 얼마나 좋은 궁금합니다. 내 프로젝트에서 나는 다른 컨트롤러 메서드를 호출하는 메서드가 있고이 메서드는 간접적 인 재귀에서 첫 번째 메서드를 호출 한 다음 두 번 반환하고 다음 개체로 리디렉션합니다. 원하는 동작처럼 들리지만, Play! 사용자는 명확하게 이해해야하므로 모든 http 작업을 Java 호출을 위해 피할 수 있습니다. –

+1

"@Util"주석 또는 일반적인 개인 메서드를 사용하여 다른 일반적인 메서드를 리디렉션 대신 직접 Java 호출을 수행하려는 경우 –