2013-12-12 11 views
8

otrzymaniem kodu Pythona:Jak używać Pythona Mock podnieść wyjątek - ale z errno wartość danej wartości

elif request.method == 'DELETE': 
    try: 
     os.remove(full_file) 
     return jsonify({'results':'purged %s' % full_file}) 

    except OSError as e: 
     if e.errno != errno.ENOENT: 
      raise 

     return jsonify({'results':'file not present: %s' % full_file}) 

Chcę przetestować wszystkie możliwe ścieżki, w tym obsługę wyjątków. Korzystanie Mock, jest to dość łatwe do podbiciem wyjątek, który mam zrobić z tym kodem:

with patch('os.remove', new=Mock(side_effect=OSError(errno.ENOENT))): 
    self.assertRaises(OSError, self.app.delete, file_URL) # broken 

Mock podnosi wyjątek, który ma wydrukowaną wartość 2 (ENOENT) - ale e.errno jest ustaw na BRAK. Do tej pory nie znalazłem sposobu, aby to ustawić. Wynikiem jest, że wyjątek zawsze dostaje ponownie podniesiony, a ja nigdy nie osiągam ostatniego wiersza kodu w moim teście jednostki.

Próbowałem również stworzyć klasę dummy z zestawem errno i zwróciłem to. Ale jeśli nie ma ustawionego * side_effect *, to nie wywołuje wyjątku, a kiedy ustawię side_effect, nie otrzymam object.errno jako wartości zwracanej.

Czy istnieje sposób na podniesienie wyjątku, gdy obiekt wyjątku ma ustawiony atrybut errno?

Odpowiedz

6

Przekaż dwa argumenty do konstruktora OSError. (Pierwszy powinien być errno).

Na przykład:

>>> OSError(2).errno 
>>> OSError(2, 'message').errno 
2 
>>> OSError(2, 'message').strerror 
'message' 
+0

Wow, to było szybko - i prawidłowe. :) Czy było to gdzieś w dokumentach Python's Exception? Czytałem je, ale mogłem coś przeoczyć. –

+0

@JohnC, podniosłem OSError celowo i zaznaczyłem atrybut 'args' obiektu wyjątku. – falsetru

+0

Interesujące - jak ustaliłeś, że jednym z "argumentów" było 'errno'? Patrzę na to, to po prostu wydaje się krotka. –

Powiązane problemy