2016-12-19 11 views
5

Mam aplikację, która importuje moduł z PyPI. Chcę pisać unittests dla kodu źródłowego tej aplikacji, ale nie chcę używać modułu z PyPI w tych testach.
Chciałbym wyśmiać go całkowicie (testowa maszyna nie będzie zawierała tego modułu PyPI, więc każdy import się nie powiedzie).Makiety cały moduł w python

Obecnie za każdym razem, gdy próbuję wczytać klasę, którą chcę przetestować w jednostkach, natychmiast pojawia się błąd importu. tak myślałem o może użyciu

try: 
    except ImportError: 

i złapać ten błąd importu, a następnie użyć command_module.run(). Wydaje się to dość ryzykowne/brzydkie i zastanawiałem się, czy jest inny sposób.

Innym pomysłem było napisanie adaptera do owinięcia tego modułu PyPI, ale wciąż nad nim pracuję.

Jeśli wiesz, że mogę wyśmiać cały pakiet Pythona, byłbym bardzo wdzięczny. Dzięki.

Odpowiedz

2

Jeśli chcesz zagłębić się w system importowania Pythona, bardzo polecam David Beazley's talk.

Jeśli chodzi o konkretne pytanie, oto przykład, który testuje moduł, gdy brakuje jego zależności.

bar.py - moduł chcesz przetestować kiedy my_bogus_module brakuje

from my_bogus_module import foo 

def bar(x): 
    return foo(x) + 1 

mock_bogus.py - plik w swoim testów, które będą ładować próbny moduł

from mock import Mock 
import sys 
import types 

module_name = 'my_bogus_module' 
bogus_module = types.ModuleType(module_name) 
sys.modules[module_name] = bogus_module 
bogus_module.foo = Mock(name=module_name+'.foo') 

test_bar.py - testuje bar.py gdy jest my_bogus_module jest niedostępny

import unittest 

from mock_bogus import bogus_module # must import before bar module 
from bar import bar 

class TestBar(unittest.TestCase): 
    def test_bar(self): 
     bogus_module.foo.return_value = 99 
     x = bar(42) 

     self.assertEqual(100, x) 

Powinieneś prawdopodobnie zrobić to trochę bezpieczniej, sprawdzając, czy my_bogus_module nie jest faktycznie dostępny po uruchomieniu testu. Możesz także przyjrzeć się metodzie pydoc.locate(), która spróbuje zaimportować coś i zwróci None, jeśli się nie powiedzie. Wydaje się, że jest to metoda publiczna, ale nie jest tak naprawdę udokumentowana.

+0

To jest dokładnie to, czego szukałem. Dzięki! – TzurEl