2013-11-28 14 views
7

Tôi có một phương thức gọi phương thức khác hai lần, với các đối số khác nhau.Kiểm thử đơn vị: Cách xác nhận nhiều cuộc gọi cùng một phương thức?

class A(object): 
    def helper(self, arg_one, arg_two): 
     """Return something which depends on arguments.""" 

    def caller(self): 
     value_1 = self.helper(foo, bar) # First call. 
     value_2 = self.helper(foo_bar, bar_foo) # Second call! 

Sử dụng assert_called_with giúp tôi chỉ xác nhận cuộc gọi đầu tiên chứ không phải cuộc gọi thứ hai. Thậm chí assert_called_once_with dường như không hữu ích. Tôi đang thiếu gì ở đây? Có cách nào để kiểm tra các cuộc gọi như vậy không?

Trả lời

8

Bạn có thể sử dụng mock_calls chứa tất cả các cuộc gọi được thực hiện cho một phương thức. Danh sách này chứa cuộc gọi đầu tiên, cuộc gọi thứ hai và tất cả các cuộc gọi tiếp theo. Vì vậy, bạn có thể viết các xác nhận với mock_calls[1] để nêu rõ điều gì đó về cuộc gọi thứ hai.


Ví dụ, nếu m = mock.Mock() và mã không m.method(123) sau đó bạn viết:

assert m.method.mock_calls == [mock.call(123)] 

mà khẳng định rằng danh sách các cuộc gọi đến m.method là chính xác một cuộc gọi, cụ thể là một cuộc gọi với đối số 123.

+0

Ví dụ trong tài liệu hướng dẫn của họ không làm cho rất nhiều ý nghĩa. Bạn có thể hiển thị một ví dụ tốt hơn không? – byxor

+1

@BrandonIbbotson Tôi đã thêm một ví dụ vào câu trả lời ở trên. –

1

Để thêm câu trả lời của Simon Visser, bạn có thể sử dụng phương pháp unittest.TestCaseself.assertEqual() thay vì cú pháp assert, điều tôi muốn nói là thực hành tốt hơn trong ngữ cảnh Thử nghiệm đơn vị si nce bạn cũng có thể thêm ý kiến ​​vào nó sẽ được hiển thị bất cứ khi nào có sự cố.

Vì vậy, ví dụ:

self.assertEqual(
    [ 
     mock.call(1, 'ValueA', True)), 
     mock.call(2, 'ValueB', False)), 
     mock.call(3, 'ValueC', False)) 
    ], 
    mock_cur.execute.mock_calls, 
    "The method was not called with the correct arguments." 
) 
+0

Nó sẽ là tốt đẹp nếu bạn thay vì cập nhật câu trả lời của mình, điều này dường như không trả lời câu hỏi. – 0xc0de

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