2012-06-05 12 views
9

Çok parçalı form verilerini girdi olarak alan bir Play 2 kontrol cihazı için bir fonksiyon testi oluşturmaya çalışıyorum. Çok parçalı form POST'u desteklemek için şu anda FakeRequest'te herhangi bir yöntem yoktur. Bu denetleyiciyi test etmenin başka yolları nelerdir? Oyun 2.0'daki MultipartFormData Testi FakeRequest

Map<String, Object> map = new HashMap<String, Object>(); 
map.put("param1", "test-1"); 
map.put("param2", "test-2"); 
map.put("file", file) 
Result result = routeAndCall(fakeRequest(POST, "/register").withFormUrlEncodedBody(map));// NO SUCH METHOD 

DÜZENLEME

: Bu benim multipart test etmek yaptılar çözümdür.

HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://localhost:3333/blobupload"); 

    FileBody imageFile = new FileBody(new File("test/resources/test-1.jpg")); 
    StringBody guid1 = null; 
    StringBody guid2 = null; 
    try { 
     guid1 = new StringBody("GUID-1"); 

    } catch (UnsupportedEncodingException e1) { 
     e1.printStackTrace(); 
    } 

    MultipartEntity reqEntity = new MultipartEntity(); 
    reqEntity.addPart("key1", imageFile); 
    reqEntity.addPart("key2", guid1); 

    httppost.setEntity(reqEntity); 

    HttpResponse response; 
    try { 
     response = httpclient.execute(httppost); 
     HttpEntity resEntity = response.getEntity(); 

     assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 

cevap

7

Sen Çal Framework 2 için sadece Scala API kullanmak withFormUrlEncodedBody

@Test 
public void testMyAction() { 
    running(fakeApplication(), new Runnable() { 
     public void run() {     
      Map<String,String> data = new HashMap<String, Object>(); 
      data.put("param1", "test-1"); 
      data.put("param2", "test-2"); 
      data.put("file", file); 

      Result result = callAction(
       controllers.whatever.action(), 
       fakeRequest().withFormUrlEncodedBody(data) 
      ) 
      ... 
     } 
    } 
} 

kullanmak callAction kullanmalıdır ama withFormUrlEncodedBody kullanarak çok parçalı formu test edebilirsiniz sanmıyorum.

Sen Scala bu şekilde yapabilirsiniz:

import play.api.libs.Files._ 
import play.api.mvc.MultipartFormData._ 

class MyTestSpec extends Specification { 

    "mytest should bla bla bla" in { 
     running(FakeApplication(aditionalConfiguration = inMemoryDatabase())) { 
      val data = new MultipartFormData(Map(
       ("param1" -> Seq("test-1")), 
       ("param2" -> Seq("test-2")) 
      ), List(
       FilePart("payload", "message", Some("Content-Type: multipart/form-data"), play.api.libs.Files.TemporaryFile(new java.io.File("/tmp/pepe.txt"))) 
    ), List(), List()) 

      val Some(result) = routeAndCall(FakeRequest(POST, "/route/action", FakeHeaders(), data)) 
      ... 
     } 
    } 
} 

Sana Java çevirmek sanırım, özür Java bu kodu nasıl bilmiyorum.

PD: Üzgünüm benim İngilizce için hala

+0

? routeAndCall da çalışmalıdır. routeAndCall (fakeRequest (POST, "/route").withFormUrlEncodedBody(map)); – angelokh

+0

Mutlipartformdata, sizlerle birlikte scala için çalışabilir. Ancak, java içinFormUrlEncodedBody, Object türünde bir değere sahip bir haritaya izin vermez. – angelokh

+0

Java aromasında callAction'ın neden gerekli olduğunu bilmiyorum, ancak callAction ile sadece fakeRequest(). WithFormUrlEncodeBody'i çağırabilirsiniz gibi görünüyorsunuz, Java dilini çok bilmiyorum, böylece tamamen yanlış olabilirim. Ben multipartı test etmek için withFormUrlEncodedBody kullanmanız gerektiğini düşünmüyorum, sadece doğru POST isteğini oluşturmalısınız. – DamnWidget

2

Bunu yapmanın en kolay yolu aşağıdaki gibi Scala kullanmaktır öğreniyorum: Bu kontrolör yöntemi formun olduğu üstleniyor

val formData = Map(
    "param-1" -> Seq("value-1"), 
    "param-2" -> Seq("value-2") 
) 
val result = routeAndCall(FakeRequest(POST, "/register").copy(body=formData)) 

: gerçekten Java kullanmanız gerekiyorsa

def register = Action(parse.tolerantFormUrlEncoded) { ... } 

, adlı parametrelere erişimi yoktur, bu yüzden 'kopya' yöntemi yukarıda tam olarak çağrılacak olurdu. Java FakeRequest proxy'nin bir kopya yöntemine sahip olmadığından, scala play.api.test.FakeRequest nesnesini içe aktarmaya da dikkat edin.

+0

Form dosyasında dosyaya izin var mı? – angelokh

2

İşte bir istek için çok parçalı/form-veri içeriği oluşturmak için Java'daki callAction() ile bir çözüm. En azından Play 2.2.3'te çalışıyor. İçerik türüm uygulama/zip oldu. Bunu değiştirmek isteyebilirsiniz. callAction withFormUrlEncodeBody için gereklidir Neden

@Test 
public void callImport() throws Exception { 
    File file = new File("test/yourfile.zip"); 
    FilePart<TemporaryFile> part = new MultipartFormData.FilePart<>(
      "file", "test/yourfile.zip", 
      Scala.Option("application/zip"), new TemporaryFile(file)); 
    List<FilePart<TemporaryFile>> fileParts = new ArrayList<>(); 
    fileParts.add(part); 
    scala.collection.immutable.List<FilePart<TemporaryFile>> files = scala.collection.JavaConversions 
      .asScalaBuffer(fileParts).toList(); 
    MultipartFormData<TemporaryFile> formData = new MultipartFormData<TemporaryFile>(
      null, files, null, null); 
    AnyContent anyContent = new AnyContentAsMultipartFormData(formData); 

    Result result = callAction(
      controllers.routes.ref.ImportExport.import(), 
      fakeRequest().withAnyContent(anyContent, 
        "multipart/form-data", "POST")); 

    // Your Tests 
    assertThat(status(result)).isEqualTo(OK); 
} 
0
Map<String, Object> data = new HashMap<String, Object>(); 
map.put("param1", "test-1"); 
map.put("param2", "test-2"); 

    final Http.RequestBuilder request = Helpers.fakeRequest() 
       .method(POST) 
       .bodyForm(formData) 
       .uri("/register"); 

     final Result result = route(app, request);