0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【pytest】motoで作ったS3のデータをAzureBlobStorageに投げられなかった【TDD】

Posted at

S3にあるCSVを持ってきて、Blobに上げるという動作をする関数のテスト作成中、謎のエラーが出てきた。

azure.common.AzureException: cannot unpack non-iterable CallbackRespoon\storageclient.py:302: AzureException

テストしたい関数が以下

upload.py
import os
import boto3
import pandas as pd
from azure.storage.blob import BlockBlobService

def s3_to_blog():
    objkey = f"file/data.csv"
    s3 = boto3.client('s3')
    obj = s3.get_object(Bucket=KCAI_STORAGE, Key=objkey)
    df = pd.read_csv(io.BytesIO(obj['Body'].read()))

    service = BlockBlobService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)
    output = df.to_csv(index=False, encoding = "utf-8")
    service.create_blob_from_text("container", f"updata.csv", output)

テストが以下

upload.py
import s3_to_blog
from moto import mock_dynamodb2, mock_s3
import boto3

@mock_s3
@mock_dynamodb2
def test_s3_to_blog():
    bucket_name = "storage"
    s3 = boto3.resource('s3', region_name='us-east-1')
    buket = create_bucket(s3, bucket_name)
    upload_file(buket, f"./test_data.csv", "file/data.csv")

    upload.s3_to_blog()

def upload_file(bucket: object, path: str, obj_key: str):
    with open(path, mode="rb") as f:
        result = bucket.put_object(Key=obj_key, Body=f)
    return result

def create_bucket(s3: object, bucket_name: str) -> object:
    bucket = s3.Bucket(bucket_name)
    bucket.create()
    return bucket

たぶんmotoのせい

これ、motoを外して、S3に全く同じデータを用意してテストしたところ通った。
なのでmotoをつかって作ったS3から取得したデータをblobに上げることができないと考える。(なんでかはわかってない)

じゃあどうするん

仕方がないので、s3のデータをblobにアップロードする箇所のテスト(それが含まれるテスト)はmotoを使わない、とするしかないんじゃないかな。motoの動作とかをもっと理解したら回避方法があるのかも。
時間ができたら確認して、いい解決方法がないか考えたいものです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?