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の動作とかをもっと理解したら回避方法があるのかも。
時間ができたら確認して、いい解決方法がないか考えたいものです。