当前位置: 首页 > 知识库问答 >
问题:

拖放向导 拖放向导AppRule 测试分段文件上传

薛宜
2023-03-14

我目前正在尝试通过调用一个以MultiPartFormData作为输入的资源来编写一个IT测试。

它在应用程序“正常”启动时工作,但在使用DropwizardAppRule助手启动时不工作。

这是我的代码:

@Test
public void importProductAndOfferCsvShopInput() {
    // Given
    var shopId = "id";
    var multipartHeaders = headers;
    multipartHeaders.putSingle("Content-Type", "multipart/form-data");

    var file = new File("src/test/resources/import/products&offers.csv");
    var fileDataBodyPart = new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE);
    MultiPart multiPart = new FormDataMultiPart().bodyPart(fileDataBodyPart, MediaType.MULTIPART_FORM_DATA_TYPE);

    // When
    var response = QORUS_APP.client().target(String.format("http://localhost:%d/ui/shop-inputs/csv/%s", 8082, shopId))
                            .queryParam("importContentType", "BOTH")
                            .request()
                            .headers(multipartHeaders)
                            .post(Entity.entity(multiPart, multiPart.getMediaType()));

    // Then
    assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
}

QORUS_APP的发音如下:

public abstract class AbstractRestResourceTest {

    @ClassRule
    public static final DropwizardAppRule<Configuration> QORUS_APP = ResourceSuite.QORUS_APP;
    private static final String USER_API_KEY = "authenticatedUserApiKey";

    protected static MultivaluedMap<String, Object> headers;

    public AbstractRestResourceTest() {
        headers = new MultivaluedHashMap<>();
        headers.putSingle("Content-Type", "application/json");
        headers.putSingle("Accept", "*/*");
        headers.putSingle(NgTokenAuthFilter.AUTHORIZATION_HEADER, "Bearer " + USER_API_KEY);
    }
}

我收到以下错误:

消息找不到媒体类型=多部分/表单数据,类型=类组织.玻璃鱼.泽西岛.媒体.多部分.html" target="_blank">表单数据多部分,通用类型=类组织.玻璃鱼.泽西岛.媒体.多部分.表单数据多部分。消息正文提供不明例外:找不到媒体类型=多部分/表单数据,类型=类组织“玻璃鱼”“媒体”多部分“多部分”数据“,”多部分“表单数据多部分,通用类型=类组织”玻璃鱼“”泽西岛“媒体”多部分“表单数据多部分。

请注意,在应用程序引导中需要注册多部分:

    private List<Resource> configureJersey(Configuration config, Environment environment) {
    // adds some required features
    environment.jersey().register(MultiPartFeature.class);

更新:

感谢@paul samsotha花时间回答。

我做了以下工作:

@Test
public void importProductAndOfferCsvShopInput() {
    // Given
    var shopId = "5b03ebe9c9aa0423b4a73dce";
    var multipartHeaders = headers;
    multipartHeaders.putSingle("Content-Type", "multipart/form-data");

    var file = new File("src/test/resources/import/products&offers.csv");
    var fileDataBodyPart = new FileDataBodyPart("file", file);
    var multiPart = new FormDataMultiPart().bodyPart(fileDataBodyPart);

    // When
    var response = QORUS_APP.client()
                            .target(String.format("http://localhost:%d/ui/shop-inputs/csv/%s", 8082, shopId))
                            .register(MultiPartFeature.class)
                            .queryParam("importContentType", "BOTH")
                            .request()
                            .headers(multipartHeaders)
                            .post(Entity.entity(multiPart, multiPart.getMediaType()));

    // Then
    assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
}

就像你建议的那样。

共有1个答案

湛骏祥
2023-03-14

错误发生在客户端,在客户端发出请求之前。请参阅表单上的文档,它将显示您还需要在客户端注册多部分功能。您可以向客户端网络目标注册它。Dropwizard建议您将其注册到WebTarget,如示例所示。

var response = QORUS_APP.client()
        .target(...)
        .register(MultiPartFeature.class)
        ...
 类似资料:
  • 典型的DropWizard应用程序指定一个应用程序子类,并覆盖其< code>initialize方法,如下所示: 在仔细阅读了DropWizard文档以及爪哇文档之后: -YAML配置文件的对象表示。使用您自己的配置属性扩展它,它们也将从YAML文件中解析。 -启动前的应用程序环境,包含引导Dropwizard命令所需的一切。 -Dropwizard应用程序的环境。 但是这些是相当模糊的类定义,

  • 我尝试使用dropWizard库获取JVM度量值(MemoryUsageGaugeSet、GarbageCollectionUsageGaigeSet) 代码实现。 我得到的结果是 {heap.committed=com.codahale.metrics.jvm.MemoryUsageGaugeSet$8@d16011, non-heap.used=com.codahale.metrics.jvm

  • 问题内容: 我正在尝试向我的SwiftUI Mac应用程序添加“拖放”手势/功能。 我想将文件从系统/桌面拖放到应用程序中。我发现它可以在常规Swift中使用。我现在正尝试在SwiftUI中执行此操作。 我在SwiftUI for Views中找到了一个函数。但是,看起来这仅适用于应用程序内部的内部手势。我想从外面拖文件。 在Swift中,您需要为拖动的类型注册NSView。 我想创建一个NSVi

  • 作为桌面程序,当然希望能够实现操作系统的 drag & drop 功能。 很多网站已经支持拖拽文件 Electron 当然也支持 要在 app 中实现此功能 ,你需要在 Render 进程中调用webContents.startDrag(item) API, 此API会给 Main 进程发送一个ondragstart事件。 在 Render 进程中, 接收 ondragstart 事件并发送消息到

  • 概览 作为桌面程序,当然希望能够实现操作系统的 drag & drop 功能。 很多网站已经支持拖拽文件, Electron 当然也支持 要在您的应用中实现此功能,您需要调用 webContent.startDrag(item) API 响应 ondragstart 事件。 示例 一个演示如何动态创建要从窗口中拖出的文件的示例。 Preload.js 在 preload.js 中使用 contex

  • 允许拖放树中的节点,从而进行移动或复制操作。 $.jstree.defaults.dnddnd plugin 存储拖放插件的所有默认设置 $.jstree.defaults.dnd.copydnd plugin 一个布尔值,指示在拖动时是否应该可以进行复制(通过按入meta键或Ctrl)。默认为 true. $.jstree.defaults.dnd.open_timeoutdnd plugin