2013-11-28 16 views
7

Başka bir yöntemi farklı argümanlarla iki kez çağıran bir yöntem var.Birim testi: Aynı yöntemle birden fazla çağrı nasıl onaylanır?

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! 

assert_called_with kullanılması sadece ilk çağrıyı değil, ikinci bir iddia bana yardımcı oluyor. assert_called_once_with bile yardımcı olmuyor. Burada neyi özlüyorum? Bu tür çağrıları test etmenin herhangi bir yolu var mı?

cevap

8

Bir yöntemde yapılan tüm çağrıları içeren mock_calls'u kullanabilirsiniz. Bu liste ilk aramayı, ikinci aramayı ve sonraki tüm çağrıları içerir. Böylece ikinci görüşme hakkında bir şey belirtmek için mock_calls[1] ile iddialar yazabilirsiniz. m = mock.Mock() ve kod m.method(123) sonra yazıyor Örneğin


:

m.method çağrı listesi tam olarak bir çağrı, argüman 123 ile yani bir çağrı olduğunu iddia
assert m.method.mock_calls == [mock.call(123)] 

.

+0

kendi belgelerinde örnek çok mantıklı değil. Daha iyi bir örnek gösterebilir misin? – byxor

+1

@BrandonIbbotson Yukarıdaki cevaba bir örnek ekledim. –

1

Simon Visser'in cevabı eklemek için, bunun yerine Birim test bağlam si daha iyi bir uygulamadır söyleyebilirim assert sözdizimi ait unittest.TestCaseself.assertEqual() yöntemi kullanabilirsiniz nce, bir şeyler yanlış gittiğinde görüntülenecek olan yorumları da ekleyebilirsiniz. Örneğin bu şekilde

:

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

Bunun yerine cevabını güncellemeniz güzel olurdu, bu soruya cevap vermiyor gibi görünüyor. – 0xc0de