2012-02-05 22 views
9

Birim testleri, işlevselliği sınamalı ve uygulama ayrıntılarını algılamaya çalışmalıdır. Mock.assert_called_with() uygun bir işlevdir, ancak AFAIK, *args'u *args ve ile **kwargs arasında karşılaştırır. Bu nedenle:Mock.assert_called_with() args vs kwargs için agnostic

# class to be mocked during test 
class SomeClass(): 
    def func(self,a,b,c=5): 
     # ... 

# code under test 
somaclass_instance.func(1,b=2,c=3) 

# test code that works 
someclass_mock.func.assert_called_with(1,b=2,c=3) 

# test code that won't work 
someclass_mock.func.assert_called_with(1,2,c=3) 
someclass_mock.func.assert_called_with(a=1,b=2,c=3) 

gerçekten bir uygulama ayrıntıdır func çağrısına, içinde **kwargs olarak kullanılan hangi *args özelliklerini, göz ardı edilecektir ki bu genelleme bir yolu var mı?

+0

Sorunu anladığımdan% 100 emin değilim, ama aynı işlev çağrısında * args ve ** kwargs'I KİLİTLEDİĞİNİZ ya da args tip tuple olduğundan ve kwargs dicts olduğundan girişi, normalde çalıştığınız şekilde normalize eden bir sarmalayıcı işlevi yazabilir. –

+1

Şimdiye kadar böyle bir sahte çerçeve var mı? Testlerim başarısız olmamalı çünkü birisi bir pozisyon argümanını bir noktada bir anahtar kelime argümanında değiştirmeye karar verdi. Ancak, bu soru, bahsettiğim bu sorunu gördüğüm tek zamandır. Mock zaten spec-nesneleri destekler, bu mümkün olmalı? – jan

cevap

5

Bir özellik isteğini sahte olarak dosyalayın.

Temel sorun gerçek işlevine erişimi olmayan/sınıf sahte anahtar kelime argümanlar sırasını bilmenin bir yolu vardır, o invokasyonlar call(a=1, b=2) olduğunu ve invokasyonlar call(1, 2) ve call(2, 1) yok ederken call(b=2, a=1), alay etmek özdeş bakmak.

amock.afunc.assert_called_with(1, 2, c=3, __prototype__=lambda a=None, b=None, c=None: None) 
1

Python 3.4 beri istediğin gibi, belirli çağrı imzaları iddia: Eğer sahte genellemek isterseniz

, bir çağrı prototipi veya prototip yerine bir işlev, örneğin geçmesi gerekecektir otomatik belirtme özelliği kullanılırken, bir teknik özellik ile callable Mock oluşturulduğunda ve nesne yöntemleri için otomatik olarak normalleştirilir. the documentation of the Mock class çok ucundan

: çağrı sahte eşleşen zaman

bir spec (veya spec_set) ile oluşturulan bir çağrılabilir sahte özellikleri nesnenin imza içgözlem. Bu nedenle, gerçek çağrının argümanlar eşleşebilir bakılmaksızın pozisyonel olarak geçirildi olsun veya adıyla: Bu (assert_called_with için geçerlidir

>>> def f(a, b, c): pass 
... 
>>> mock = Mock(spec=f) 
>>> mock(1, 2, c=3) 
<Mock name='mock()' id='140161580456576'> 
>>> mock.assert_called_with(1, 2, 3) 
>>> mock.assert_called_with(a=1, b=2, c=3) 

), assert_called_once_with(), assert_has_calls() ve assert_any_call(). Autospeccing olduğunda, , sahte nesnede yöntem çağrıları için de geçerli olacaktır.

Sürüm 3.4 olarak değiştirildi: Özel ve otomatik olarak eşleştirilen sahte nesneler üzerinde imza iç içe ekleme eklendi.

İlgili konular