使用带有Play Framework 2.2文件的fakeRequest测试java控制器

时间:2014-07-11 18:04:34

标签: java testing playframework-2.2

我正在尝试测试我的控制器,该控制器从<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..
        }
    });
}

0 个答案:

没有答案