2016-02-28 11 views
6

Używam Flask-Testing do moich testów integracji z Flask. Mam formularz, który ma plik do przesłania dla logo, do którego próbuję napisać testy, ale ciągle pojawia się komunikat o błędzie: TypeError: 'str' does not support the buffer interface.Testowanie przesyłania plików w kolbie

Używam Pythona 3. Najbliższa odpowiedź, którą znalazłem to this, ale nie działa dla mnie.

To właśnie jeden z moich wielu prób wygląda następująco:

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) 

jaki sposób można przetestować przesłać plik w kolbie?

Odpowiedz

6

Emisja zakończyła się nie jest tak, gdy dodaje się content_type='multipart/form-data' do metody, jakiej oczekuje się od wszystkich wartości w data być plikami lub ciągami. W moim dyktowaniu danych znalazły się liczby całkowite, które zrozumiałem dzięki komentarzowi this.

więc rozwiązanie koniec skończyło się patrząc tak:

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

Tak bardzo cię kocham, pocałowałbym cię teraz. Zmarnowałem całą godzinę, próbując dojść do tego, co jest nie tak ... dobry panie, jesteś moim wybawcą. – Rodrigo

7

trzeba dwie rzeczy:

1.) content_type='multipart/form-data' w swoim .post()
2) w swoim podaniu data= w file=(BytesIO(b'my file contents'), "file_name.jpg")

Pełne przykład:

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

Dzięki @ mam8cc. Czy możesz wyjaśnić mi punkt 2? Wydaje mi się, że mówisz o przekazaniu słowa kluczowego do słownika, którego nie rozumiem. Czy możesz podać krótki przykład kodu? – hammygoonan

+0

@hammygoonan Mam zaktualizowane pytanie z bardziej kompletnym przykładem. – mam8cc

+0

Jeszcze raz dziękuję @ mam8cc, myślę, że gdzieś się dostaniemy. Jeśli użyję kodu, który masz w swojej odpowiedzi, to naprawi problem. Jednak gdy dodaję dodatkowe pola do dyktanda danych, łamie się to za pomocą 'TypeError'. Zmieniłem moje pytanie, aby było jaśniejsze. – hammygoonan

Powiązane problemy