2015-05-20 8 views
9

mock (http://mock.readthedocs.org/en/latest/index.html) birim testi için Python harika bir araçtır. Bu uygun bir yöntem ya da sınıf taklit veya dict.But ben taklidinin tarafından başa basit bir yol bulamadık bir sorunla karşılaştı. MagicMock bir dict gibi davranmasına nasıl izin verilir?

Bu

fonksiyon test edilecek olan:

def function_to_be_tested(id, responses): 
    if not id in responses: 
     print '%s not exist'%pole_id 
     return 

    if id in responses.redundantErrorResponses: 
     print '%s is redundant'%pole_id 
     return 

    do_something() 

argüman tepkileri dict doğal özellikleri dışında (örneğin redundantErrorResponses gibi) başka bir öznitelikleri nesne gibi dict olup. Şimdi id in responses True ve id in responses.redundantErrorResponses Yanlış olmaya izin sahte yanıtları inşa etmek istiyorum.

pole_id = 30 
pole_value = 100 
pole_dic = {pole_id:pole_value} 
mock_responses = MagicMock() 
mock_responses.__getitem__.side_effect = lambda k: pole_dic[k] 
mock_responses.__iter__.side_effect = iter(pole_dic) 
mock_responses.redundantErrorResponses = {} 

Ama hata oluştu: Bu benim yaptığım

yüzden (a MagicMock nesne arada bir dict gibi yineleme ya da nasıl bir dict arada MagicMock özellikleri destekleyen inşa edebilir inşa nasıl
function_to_be_tested(pole_id, mock_responses) 

>>30 not exist 

özniteliği serbestçe ekle)

+0

o '' 'function_to_be_tested (pole_id, mock_responses)' '' olmalı: __contains__ bulaşmak istiyorum geliyor bana? – wwii

cevap

11

Neden __iter__ ile karışıklık yaşanıyor?

>>> import mock 
>>> m = mock.MagicMock() 
>>> d = {'foo': 'bar'} 
>>> m.__getitem__.side_effect = d.__getitem__ 
>>> m.__iter__.side_effect = d.__iter__ 
>>> m['foo'] 
'bar' 
>>> 'foo' in m 
False 
>>> m.__contains__.side_effect = d.__contains__ 
>>> 'foo' in m 
True 
1

Her zamanda aynı şeyi yapmak için bazı aptal sınıf oluşturabilir.

In [94]: class MockResponses(dict): 
    ....:  @property 
    ....:  def redundantErrorResponses(self): 
    ....:   return {} 
+0

Ben de aynı şeyi önermek için çok yakındım :-). Bir not - Hatta burada bir 'property' gerek yoktur - Sen sadece bir sınıf özelliği olarak' redundantErrorResponses' olabilir sadece zaten 1 örneğini yapmak için gidiyoruz çünkü ... – mgilson

+0

Evet, bu benim ilk çözümdür ama sadece "bir MagicMock nesnesinin nasıl inşa edildiğini bir dikte gibi yineleyebileceğini" bilmek istiyorum. @ mgilson'un cevabı doğrudur. – lengxuehx

İlgili konular