2016-02-28 23 views
6

Flaskの統合テストにFlask-Testingを使用しています。私はテストを書くことを試みているロゴのファイルアップロードを持っているフォームを持っていますが、私はエラー:TypeError: 'str' does not support the buffer interfaceを続けています。Flaskでのファイルアップロードのテスト

私はPython 3を使用しています。私が見つけた最も近い答えはthisですが、それは私のために働いていません。

これは私の多くの試みの一つは次のようになります。

def test_edit_logo(self): 
    """Test can upload logo.""" 
    data = {'name': 'this is a name', 'age': 12} 
    data['file'] = (io.BytesIO(b"abcdef"), 'test.jpg') 
    self.login() 
    response = self.client.post(
     url_for('items.save'), data=data, follow_redirects=True) 
    }) 
    self.assertIn(b'Your item has been saved.', response.data) 
    advert = Advert.query.get(1) 
    self.assertIsNotNone(item.logo) 

どのように一つの試験フラスコ内のファイルアップロード?

答えて

6

file=(BytesIO(b'my file contents'), "file_name.jpg")

であなたのdata=パスで完全な例を

1)あなたの.post()
2のcontent_type='multipart/form-data'を) postメソッドにcontent_type='multipart/form-data'を追加すると、dataの値はいずれかになりますファイルまたは文字列です。 thisコメントのおかげで、私のデータ辞書に整数がありました。

ので、エンド・ソリューションは、このように見てしまった:mam8cc @

def test_edit_logo(self): 
    """Test can upload logo.""" 
    data = {'name': 'this is a name', 'age': 12} 
    data = {key: str(value) for key, value in data.items()} 
    data['file'] = (io.BytesIO(b"abcdef"), 'test.jpg') 
    self.login() 
    response = self.client.post(
     url_for('adverts.save'), data=data, follow_redirects=True, 
     content_type='multipart/form-data' 
    ) 
    self.assertIn(b'Your item has been saved.', response.data) 
    advert = Item.query.get(1) 
    self.assertIsNotNone(item.logo) 
+0

私は今あなたにキスをしています。私は何が間違っていたかを把握しようと一時間を無駄にしました...良い先生、あなたは私の救い主です。 – Rodrigo

7

あなたは二つのものが必要です。問題は終わった

data = dict(
     file=(BytesIO(b'my file contents'), "work_order.123"), 
    ) 

    response = app.post(url_for('items.save'), content_type='multipart/form-data', data=data) 
+0

感謝。あなたは私のためにポイント2を明確にすることができますか?あなたが意味するものではないと思う辞書にキーワードの引数を渡すと言っているように私に聞こえる。私に短いコード例を教えてもらえますか? – hammygoonan

+0

@hammygoonanより完全な例で質問を更新しました。 – mam8cc

+0

もう一度@ mam8cc、私たちはどこかに行っていると思います。あなたの答えにあるコードを使用すると、問題が修正されます。しかし、データ辞書に追加のフィールドを追加すると、 'TypeError'で破損します。私はそれをもっと明確にするために私の質問を編集しました。 – hammygoonan