2012-04-25 13 views
18

Załóżmy, jest to kodSzydercze - w jaki sposób mogę podnieść wyjątek na dzwoniącego?

def move(*args, **kwargs): 
    try: 
     shutil.move(source, destination) 
    except Exception as e: 
     raise e 

iw moim tests.py

@patch.object(shutil, 'move') 
def test_move_catch_exception(self, mock_rmtree): 
    ''' Tests moving a target hits exception. ''' 
    mock_rmtree.side_effect = Exception('abc') 
    self.assertRaises(Exception, move, 
          self.src_f, self.src_f, **self.kwargs) 

Mówi to

File "unittests.py", line 84, in test_move_catch_exception 
    self.src_f, self.src_f, **self.kwargs) 
AssertionError: Exception not raised 

Gdybym dochodzić na mock_rmtree to minie. Jak mogę potwierdzić na dzwoniącym (w tym przypadku funkcja move)?


Jak okowita podkreślił głównych powodów był copy-paste błąd, a także byłem twierdząc krotki na początku. Zawsze pytaj o odpowiedni typ zwrotu ...

Odpowiedz

26

Masz literówkę w swoim przykładzie, brakuje '.

To nie do końca jasne, o co prosisz, ale jeśli dobrze cię rozumiem, pytasz, jak przetestować, czy podniesiony wyjątek został złapany wewnątrz move. Jeden problem polega na tym, że łatasz shutil.rmtree, a nie shutil.move, ale nie możesz być pewny, że kiedykolwiek zostanie wywołane shutil.rmtree. shutil.move tylko wywołuje shutil.rmtree, jeśli pomyślnie kopiuje katalog, ale ponieważ kopiujesz do siebie self.src_f, tak się nie stanie. Nie jest to jednak dobry sposób na poprawianie, ponieważ założenie, że shutil.move będzie w ogóle wywoływać shutil.rmtree, nie jest gwarantowane i zależy od implementacji.

chodzi o jak go przetestować, wystarczy sprawdzić, że zwracana jest wartość zgodnie z oczekiwaniami:

@patch.object(shutil, 'move') 
def test_move_catch_exception(self, mock_move): 
    ''' Tests moving a target hits exception. ''' 
    e = OSError('abc') 
    mock_move.side_effect = e 
    returns = move(self.src_f, self.src_f, **self.kwargs) 
    assert returns == (False, e) 
+2

Dziękuję bardzo. Przeprosiłem za zamieszanie. To był błąd kopiowania i wklejania, którego nie złapałem. Tak, poprawiam ruch, a nie rmtree. Odpowiednio zredagowałem wpis. Masz rację co do mojego niedbalstwa tutaj. Wielkie dzięki. – CppLearner

Powiązane problemy