我正在尝试测试我的控制器,该控制器从<form>
接收 csv 文件为multipart/form-data
。提交的编码如下:
@form(routes.CsvController.read(),
'enctype -> "multipart/form-data",
Symbol("accept-charset") -> "UTF-8") {
<input type="file" name="csv">
<input type="submit" value="Send">
}
在控制器中接收它时,它与代码完美配合如下:
package controllers;
import //..
public class CsvController extends Controller {
//..
public static Result read() {
MultipartFormData body = request().body().asMultipartFormData();
FilePart filePart = body.getFile("csv");
if (filePart != null) {
String contentType = filePart.getContentType();
if (contentType.equals("application/octet-stream") || //ah, windows..
contentType.equals("text/csv")) {
File file = filePart.getFile();
// do stuff with file..
}
}
return TODO;
}
}
然而,在测试路由时,即使我设法使用下面的代码(使用fakeServer()而不是fakeRequest())将文件提供给请求,但它有几个问题,例如硬编码URL,以及与上传文件的方式相关的错误,该文件接受 csv 以外的其他文件扩展名。
这个方法也会在失败时通过测试(可以通过在控制器中添加一个附加条件来修复 - 通过它的扩展解析filePart.getFilename() - 但这是相当不可接受的,因为修复仅用于测试)。
@Test
public void should_load_file() throws Exception{
running(testServer(9001), new Runnable() {
public void run() {
File csvFile = new File(FILE_ROOT_PATH+"example.csv");
MultipartEntity entity = new MultipartEntity();
entity.addPart("csv", new FileBody(csvFile));
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost method = new HttpPost("http://localhost:9001/csv/upload");
method.setEntity(entity);
try {
HttpResponse response = httpclient.execute(method);
// assert response..
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
是否有人知道如何使用 fakeRequest()执行此操作?骨架就像这样,就像这个项目的所有其他测试一样:
@Test
public void should_load_file() {
running(fakeApplication(), new Runnable() {
public void run() {
File csvFile = new File(FILE_ROOT_PATH+"example.csv");
// how do i create this fake request with my file?? .withBody fails
/* .withFormUrlEncodedBody also fails cause on 2.2.x it
* only accepts Map<String, String> */
FakeRequest fakeRequest = fakeRequest().withBody(csvFile);
Result result = callAction(CsvController.read(), fakeRequest);
// assert response..
}
});
}