当前位置: 首页 > 面试题库 >

在Play 2.0 FakeRequest中测试MultipartFormData

齐典
2023-03-14
问题内容

我正在尝试为Play
2控制器创建功能测试,该控制器将多部分表单数据作为输入。FakeRequest当前没有支持多部分形式POST的方法。还有什么其他方法可以测试此控制器?

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

编辑:这是我做多部分测试的解决方法。

    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();
}

问题答案:

您应该使用callAction来与FormUrlEncodedBody一起使用

@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)
            )
            ...
         }
     }
}

我只将Scala api用于Play Framework 2,但我认为您不能使用withFormUrlEncodedBody测试多部分表单。

您可以在Scala中以这种方式进行操作:

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))
            ...
        }
    }
}

我想您可以将其转换为Java,对不起,我不知道如何用Java对其进行编码。

PD:对不起,我还在学习英语



 类似资料:
  • 我试图用Jasmine为Angularjs编写单元测试。这是我的控制器: 和测试 测试失败,即使我试图测试期望(true). toBe(true); 茉莉花,因果报应,棱角分明的嘲弄都在我的索引里。jasmine调试页面中的html,还有测试脚本。 我发现如果删除beforeach()块,expect(true)。托比(真的)通过了。 下面是一个错误:

  • 在Android Espresso测试中有什么好的方法来测试结果代码和数据吗?我在用浓缩咖啡2.0。 定义一个新方法,如并使用该方法以便可以截获,等等。 编写一个只用于测试的TestActivity,它将调用上的,并在中检查结果 试着思考这两个坏处中什么是较小的,或者是否有任何其他关于如何测试这一点的建议。有什么建议吗?谢了!

  • 问题内容: 我是Maven的新手,甚至是Clojure的新手。作为一种学习语言的练习,我正在编写蜘蛛纸牌播放器程序。 我已经配置了一个Maven目录结构,其中包含通常的src / main / clojure和src / test / clojure目录。我的pom.xml文件包含clojure-maven-plugin。当我运行“ mvn test”时,尽管我在src / test / cloj

  • 问题内容: 我在这个示例中实现了具有PriorityBlockingQueue的ThreadPoolExecutor:http://codingdict.com/questions/131378 并写了一个测试: 但是最后,我没有得到1 2 3 4 5,我得到了这些数字的随机顺序。测试是否有问题,还是其他?如果首先,如何正确测试? 问题答案: 仅当池完全繁忙并且您提交了几个新任务时才考虑优先级。如

  • 我试图使用XML和TestNG运行一个测试套件,但是我总是同时使用Eclipse和命令行得到相同的消息: 该文件已正确读取,但测试似乎没有运行。 以下是我的testng.xml的内容: 这是我的目录结构在Eclipse中的样子: 此外,这也是我试图通过命令行运行测试套件的方式: 我尝试过通过eclipse清理项目,但似乎没有帮助。我也试过跑步: < code>mvn clean,但它也没有完成工作

  • 问题内容: 我正在使用带有eclipse的junit编写功能测试。 当运行单个测试时,它将按照我在类中设置它们的顺序运行。 例如。 但是,当我将此测试作为套件的一部分运行时(在包中),顺序是随机的。 例如,它将执行验证,然后删除用户,然后删除joinuserToRoom然后创建用户。 我在套件中的测试并不相互依赖。但是,测试中的每个单独测试都取决于它们以正确的顺序运行。 有什么办法可以实现? 谢谢