2011-11-17 24 views
13

Hangi yol mock kitaplığını kullanarak, alay ve iters nesne open() tarafından döndürülen test kodu için uygun olduğunu? alay ediyor dosya nesnelerin veya Iterables

whitelist_data.py

: Ben bunu test etmek için deneyin nasıl

WHITELIST_FILE = "testdata.txt" 

format_str = lambda s: s.rstrip().lstrip('www.') 
whitelist = None 

with open(WHITELIST_FILE) as whitelist_data: 
    whitelist = set(format_str(line) for line in whitelist_data) 

if not whitelist: 
    raise RuntimeError("Can't read data from %s file" % WHITELIST_FILE) 

def is_whitelisted(substr): 
    return 1 if format_str(substr) in whitelist else 0 

burada. python tests.py ait

import unittest 
import mock 

TEST_DATA = """ 
domain1.com 
domain2.com 
domain3.com 
""" 

class TestCheckerFunctions(unittest.TestCase): 

    def test_is_whitelisted_method(self): 
     open_mock = mock.MagicMock() 
     with mock.patch('__builtin__.open',open_mock): 
      manager = open_mock.return_value.__enter__.return_value 
      manager.__iter__ = lambda s: iter(TEST_DATA.splitlines()) 
      from whitelist_data import is_whitelisted 
      self.assertTrue(is_whitelisted('domain1.com')) 

if __name__ == '__main__': 
    unittest.main() 

Sonucu geçerli:

$ python tests.py 

E 
====================================================================== 
ERROR: test_is_whitelisted_method (__main__.TestCheckerFunctions) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "tests.py", line 39, in test_is_whitelisted_method 
    from whitelist_data import is_whitelisted 
    File "/Users/supa/Devel/python/whitelist/whitelist_data.py", line 20, in <module> 
    whitelist = set(format_str(line) for line in whitelist_data) 
TypeError: 'Mock' object is not iterable 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

UPD: Adam, yeniden ettik sahte kütüphanesinden (pip install -e hg+https://code.google.com/p/mock#egg=mock) ve güncellenmiş tests.py için teşekkürler. ÇALIŞIYOR bir cazibe gibi.

cevap

15
Bir MagicMock aradığınız

. Bu yineleme destekler. sahte 0.80beta4 olarak

, patch bir MagicMock döndürür. Yani bu basit bir örnek çalışır:

import mock 

def foo(): 
    for line in open('myfile'): 
     print line 

@mock.patch('__builtin__.open') 
def test_foo(open_mock): 
    foo() 
    assert open_mock.called 

sen (sen gibi görünüyor) sahte 0.7.x çalıştırıyorsanız, ben yalnız yama ile gerçekleştirebilirsiniz sanmıyorum. Daha sonra yama içine geçmesi, ayrı ayrı alay oluşturmanız gerekir:

import mock 

def foo(): 
    for line in open('myfile'): 
     print line 

def test_foo(): 
    open_mock = mock.MagicMock() 
    with mock.patch('__builtin__.open', open_mock): 
     foo() 
     assert open_mock.called 

Not - Ben py.test bu koşuyoruz Ancak bu aynı yaklaşımlar yanı unittest birlikte çalışacaktır.