LoginSignup
0
0

More than 1 year has passed since last update.

画像ファイルの送信テストを行うときのごまかし方

Posted at

今回は、HttpClientを使ってテストを行うときに、本物の画像ファイルを用意しないでMultiPartDataを送信する方法について紹介します。

まず最初に、Ktorに画像や動画を送信するとき、Ktor側ではcall.receiveMultipart()を使って、MultiPartDataを受け取ると思われます。

このとき、MultiPartDataインスタンスの中multipart data streamを表しています。
Kotlinでは、1つ以上のPartDataによってMultiPartDataが構成されています。このPartDataの種類には、PartData.FormItemPartData.FileItemなどがあります。これらは、MultiPartDataに対してforEachPartを使うことで、順番に取り出すことができます。

multipart.forEachPart { partData ->
    when(partData){
        is PartData.FormItem -> {
            // ...
        }
        is PartData.FileItem -> {
            // ...
        }
        is PartData.BinaryItem -> {
            // ...
        }
        is PartData.BinaryChannelItem -> {
            // ...
        }
    }
}

それでは本題です。PartData.FileItemを使って、テストコードから画像を送信する方法を紹介しますが、テストのためだけに画像ファイルを用意する必要があるのでしょうか?
それはとても大変であり、面倒なことだと思います。

ではどのようにして画像を送ったことを表現すれば良いのでしょうか?

ここで答えを言ってしまうと、byteArrayOf()を使うことで、画像というよりは画像データを送ったことをテストの中で表現することができます。

val response = client.post("/post") {
    setBody(MultiPartFormDataContent(
        formData {
            append("text", "こんにちわ")
            append("image", byteArrayOf(1, 2, 3), Headers.build {
                append("Content-Type", "image/jpeg")
                append("Content-Disposition", "form-data; name=\"image\"; filename=\"image.jpg\"")
            })
        },
    ))
    header("Authorization", "Bearer $token")
}

この時、一番大事なのはContent-Dispositionの部分です。これを設定することで、PartData.FileItemとして受け取ることができます。

余談ですが、append("Content-Type", "image/jpeg")を指定しなくても、PartData.FileItemとして受け取ることができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0