2011-06-15 36 views
14

Python'da bir işlevi simüle etmek için Mock'u kullanmaya çalışıyorum. İşte benim kodum:İade Mock Python ile

resp, content = request(...) 

Request() işlevinin iki değer döndürmesi gerekiyor.

with patch("syncdatetime.py") as sync_mock: 
     sync_mock.request.return_value = [obj, ''] 

Ama testini çalıştırdığınızda, ben hata alıyorum: Burada denedim ne "Sahte nesne iterable değildir." İstek işlevi, bir liste yerine Mock türünde bir nesne döndürür. İstek işlevini, bir liste döndürecek şekilde nasıl ekleyebilirim? Açıklamanın

cevap

7

Not, ben bir uzman değilim bu yüzden alay etmek yeniyim ancak, sadece aynı sorunu yaşadı ve bir dizi döndüren bir fonksiyona side_effect niteliğinin kurulması şeyler

giderdiği bulduk örnek kodla başlayan

, değiştirin:

with patch("syncdatetime.py") as sync_mock: 
    sync_mock.request.return_value = [obj, ''] 

with patch("syncdatetime.py") as sync_mock: 
    sync_mock.request.side_effect = function_returning_list 

ve tanımlamak

def function_returning_list(arg_list_of_choice): 
    #anything you want to do goes here 
    #then 
    return your_list 
+2

Bunu denemedim ama daha basit bir çözüm buldum. Modülü yamalamak yerine, işlevin kendisini yamalayın ve ardından patch.return_value değerini ayarlayın. Dürüst olmak gerekirse, bunun neden işe yaradığını tam olarak bilmiyorum ama bu şekilde, işlev bir Mock nesnesini iade etmiyor. Yine de cevabınız için teşekkürler. – Matt

7

Sorununuzun, olduğunu düşündüğünüz mock örneğini kullanmadığınızdan şüpheleniyorum. Varsayılan olarak, Mock örneği çağrıldığında bir Mock döndürür. return_valueresp, content = request() bir Mock nesne açmak için çalışıyor demektir başlatılmamış çünkü

>>> m = mock.Mock() 
>>> type(m()) 
<class 'mock.mock.Mock'>  

O request çağrınızda gibi görünen bir Mock döndürüyor.

>>> m = mock.Mock() 
>>> (a, b) = m() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'Mock' object is not iterable 

Sen listesini döndürmek için side_effect kullanmaya gerek yoktur. return_value atanması çalışmalıdır.

>>> m = mock.Mock() 
>>> m.return_value = ['a', 'b'] 
>>> (a, b) = m() 
>>> a 
'a' 
>>> b 
'b'