2015-09-25 21 views
5

Ben JUnit gelen dosya yüklemelerini kabul eden bir kontrolör yöntemi test için nasıl bir çözüme oldukça yaklaştım gibi hissediyorum günün en çalıştıktan sonra.Birim test dosya yükleme

Map<String, String> postData = makePostMap(uploadForm); 
File file = new File("test/resources/shared/uploads/blank.csv"); 
TemporaryFile temporaryFile = new TemporaryFile(file); 

MultipartFormData.FilePart filePath = new MultipartFormData.FilePart(
     "file", 
     "file.csv", 
     new scala.Some<>("text/csv"), 
     temporaryFile); 

List<MultipartFormData.FilePart> fileParts = Lists.newArrayList(filePath); 
scala.collection.immutable.Seq files = JavaConversions.asScalaBuffer(fileParts).toList(); 

Map<String, scala.collection.immutable.Seq<String>> postData2 = new HashMap<>(); 
for (String s : postData.keySet()) { 
    postData2.put(s, JavaConversions.asScalaBuffer(Lists.newArrayList(postData.get(s))).toList()); 
} 
scala.collection.immutable.Map<String, scala.collection.immutable.Seq<String>> scalaMap = 
     JavaConversions.mapAsScalaMap(postData2).toMap(Predef.<Tuple2<String, scala.collection.immutable.Seq<String>>>conforms()); 

MultipartFormData formData = new MultipartFormData(scalaMap, files, null, null); 
AnyContentAsMultipartFormData body = new AnyContentAsMultipartFormData(formData); 

// run 
login(employee); 
String url = routes.ManageContacts.uploadCsv().url(); 
FakeRequest fakeRequest = new FakeRequest(POST, url).withBody(body); 
fakeRequest = getAuthenticatedRequest(fakeRequest, employee); 

result = route(fakeRequest); 

assertThat(status(result)).isEqualTo(OK) 

Ancak, ben FakeRequest yönlendirilir istisna (aşağıda) olsun şu şekildedir: My juint testi kodudur. o ele değil olarak /Users/jcreason/bin/playframework-2.3.8/framework/src/play-test/src/main/scala/play/api/test/Helpers.scala:253

def jRoute[T](app: Application, r: FakeRequest[T]): Option[Future[Result]] = { 
    (r.body: @unchecked) match { 
     case body: AnyContentAsFormUrlEncoded => route(app, r, body) 
     case body: AnyContentAsJson => route(app, r, body) 
     case body: AnyContentAsXml => route(app, r, body) 
     case body: AnyContentAsText => route(app, r, body) 
     case body: AnyContentAsRaw => route(app, r, body) 
     case body: AnyContentAsEmpty.type => route(app, r, body) 
     //case _ => MatchError is thrown 
    } 
    } 

Ben AnyContentAsMultipartFormData geçiyordum olduğundan, bu istisna atar: aşağı yığın izleme içine

[error] Test controllers.ManageContactsTest.testUploadCsv failed: scala.MatchError: AnyContentAsMultipartFormData(MultipartFormData(Map(clearExisting -> List(false), survey -> List(11), bosMode -> List(false)),List(FilePart(file,file.csv,Some(text/csv),TemporaryFile(test/resources/shared/uploads/blank.csv))),null,null)) (of class play.api.mvc.AnyContentAsMultipartFormData), took 0.255 sec 
[error]  at play.api.test.RouteInvokers$class.jRoute(Helpers.scala:255) 
[error]  at play.api.test.Helpers$.jRoute(Helpers.scala:403) 
[error]  at play.api.test.Helpers.jRoute(Helpers.scala) 
[error]  at play.test.Helpers.route(Helpers.java:445) 
[error]  at play.test.Helpers.route(Helpers.java:437) 
[error]  at play.test.Helpers.route(Helpers.java:433) 
[error]  at controllers.ManageContactsTest.testUploadCsv(ManageContactsTest.java:121) 
[error]  ... 

Dalış, ben dosyasında aşağıdaki scala maç deyimi bulmak eşleşme tarafından. Bunu nasıl aşacağını bilen var mı? Veya (bariz cevapları sadece selenyum olarak kenara) bu farklı bir çözüm yönünde bana gelin? Eğer değil boş dosya göndermek istiyorsanız

import static play.test.Helpers.*; 
import static org.junit.Assert.*; 
import java.util.*; 
import org.junit.Test; 
import akka.stream.javadsl.Source; 
import akka.util.ByteString; 
import play.mvc.Http.MultipartFormData.*; 
import play.mvc.Http.RequestBuilder; 
import play.mvc.Result; 
import play.test.*; 

class UploadFileTest extends WithApplication { 
    @Test 
    public void uploadTest() { 
     Part<Source<ByteString, ?>> part = new FilePart<>("key", "fileName", "application/octet-stream", 
       Source.empty()); 
     List<Part<Source<ByteString, ?>>> data = Arrays.asList(part); 

     RequestBuilder requestBuilder = fakeRequest(controllers.routes.UploadController.upload()).method(POST) 
       .bodyMultipart(data, mat); 

     Result result = route(app, requestBuilder); 

     assertEquals(Helpers.OK, result.status()); 
    } 
} 

,
yerine Source.empty(): Bu kod yararlı olabilir

http://www.erol.si/2014/02/how-to-test-file-uploads-in-play-framework-java/

+0

Merhaba, yazının yazarı. Bunu Play 2.2 ile test ettim, ancak birkaç şey değişti. Daha yeni bir sürümle test edeceğim ancak bu arada örnek olarak scala https://github.com/playframework/playframework/blob/9f258fcd248ea79ad38f0fddfe4192a2ccf4afb0/documentation/manual/working/scalaGuide/main/upload/code/ScalaFileUpload adresini kontrol edebilirsiniz. scala – FrEaKmAn

+0

Java'yı kullanırken belki de şuna bakmanız faydalı olacaktır: https://github.com/playframework/playframework/blob/9f258fcd248ea79ad38f0fddfe4192a2ccf4afb0/documentation/manual/working/javaGuide/main/upload/code/JavaFileUpload.java – Anton

+0

teşekkürler cevap @FrEaKmAn için ben özgür bir an olsun, sayesinde o Scala sürümünü ödeme çalışacağım. – jcreason

cevap

0

:

Başvuru için, ben bu kodun bazı çekti FileIO.fromFile(new File("path/to/file")) kullanın;