2012-04-25 23 views
18

Giả sử đây là mãMocking - Làm cách nào để tăng ngoại lệ cho người gọi?

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

và trong tests.py tôi

@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) 

Nó nói này

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

Nếu tôi khẳng định trên mock_rmtree nó sẽ vượt qua. Làm thế nào tôi có thể khẳng định trên người gọi (trong trường hợp này, chức năng move)?


Như aquavitae chỉ ra, những lý do chính là cắt-dán lỗi, và cũng có thể tôi đã khẳng định một tuple trong đầu. Luôn luôn xác định đúng loại trả lại ...

Trả lời

26

Bạn có lỗi đánh máy trong ví dụ của mình, thiếu '.

Nó không hoàn toàn rõ ràng những gì bạn đang yêu cầu, nhưng nếu tôi hiểu bạn một cách chính xác, bạn đang hỏi làm thế nào để kiểm tra rằng một ngoại lệ lớn được đánh bắt bên trong move. Một vấn đề là bạn đang vá shutil.rmtree, không phải shutil.move, nhưng bạn không thể chắc chắn rằng shutil.rmtree sẽ từng được gọi. shutil.move chỉ thực sự gọi shutil.rmtree nếu nó sao chép thành công một thư mục, nhưng vì bạn đang sao chép self.src_f cho chính nó, điều này không xảy ra. Đây không phải là một cách rất tốt để vá nó mặc dù, bởi vì giả định rằng shutil.move sẽ gọi shutil.rmtree ở tất cả không được đảm bảo và là thực hiện phụ thuộc.

Đối với làm thế nào để kiểm tra nó, chỉ cần kiểm tra xem giá trị trả về là như mong đợi:

@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

Cảm ơn bạn rất nhiều. Tôi xin lỗi vì những nhầm lẫn. Đó là lỗi sao chép-dán mà tôi không bắt được. Có, tôi đang di chuyển vá thay vì rmtree. Tôi đã chỉnh sửa bài đăng cho phù hợp. Bạn nói đúng về sự bất cẩn của tôi ở đây. Cảm ơn rất nhiều. – CppLearner

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