2016-02-28 13 views
6

Tôi đang sử dụng Flask-Testing để kiểm tra tích hợp Flask của mình. Tôi có một biểu mẫu có tệp tải lên cho biểu trưng mà tôi đang cố gắng viết thử nhưng tôi vẫn gặp lỗi khi nói: TypeError: 'str' does not support the buffer interface.Kiểm tra tệp tải lên trong Flask

Tôi đang sử dụng Python 3. Câu trả lời gần nhất tôi đã tìm thấy là this nhưng nó không hoạt động đối với tôi.

Đây là những gì một trong nhiều nỗ lực của tôi trông giống như:

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) 

Làm thế nào để một bài kiểm tra tải lên tập tin trong Flask?

Trả lời

6

Vấn đề này đã kết thúc không phải là khi thêm content_type='multipart/form-data' vào phương thức post, nó sẽ mong đợi tất cả các giá trị trong data cho một trong hai là các tệp hoặc chuỗi. Đã có số nguyên trong dict dữ liệu của tôi mà tôi nhận ra nhờ nhận xét this.

Vì vậy, giải pháp cuối cùng đã kết thúc tìm kiếm như thế này:

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

Tôi yêu bạn rất nhiều Tôi sẽ hôn bạn ngay bây giờ. Tôi lãng phí cả một giờ cố gắng tìm ra những gì đã sai ... tốt thưa bạn, bạn là vị cứu tinh của tôi. – Rodrigo

7

Bạn cần hai điều:

1.) content_type='multipart/form-data' trong bạn .post()
2.) trong data= đường chuyền của bạn trong file=(BytesIO(b'my file contents'), "file_name.jpg")

Một ví dụ đầy đủ:

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

Cảm ơn @ mam8cc. Bạn có thể làm rõ điểm 2 cho tôi không? Nghe có vẻ như tôi nói rằng bạn đang chuyển một đối số từ khóa cho một từ điển mà tôi không nghĩ là ý của bạn. Bạn có thể cho tôi một ví dụ mã ngắn không? – hammygoonan

+0

@hammygoonan Tôi đã cập nhật câu hỏi với một ví dụ hoàn chỉnh hơn. – mam8cc

+0

Cảm ơn một lần nữa @ mam8cc, tôi nghĩ chúng ta đang đi đâu đó. Nếu tôi sử dụng mã bạn đã có trong câu trả lời của bạn thì nó sẽ khắc phục sự cố. Tuy nhiên khi tôi thêm các trường bổ sung vào dict dữ liệu, nó sẽ phá vỡ với 'TypeError'. Tôi đã chỉnh sửa câu hỏi của mình để làm rõ hơn. – hammygoonan

Các vấn đề liên quan