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/
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
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
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