A volte, è più semplice passare semplicemente un "motore s3" come parametro e passare qualche semplice simulazione -object quando invece è un test (e fornire i suoi valori di ritorno). A volte è necessario chiamare molte funzioni casuali che causano effetti collaterali (ad esempio, se si lavora con s3, ottenere l'ora corrente, fare alcune query SQL, aprire alcuni file e altro), e qui non sarebbe bello per passare tutto come parametri di funzione (poiché non è necessario ad eccezione della testabilità), ti suggerisco di utilizzare mockstar per descrivere in modo dichiarativo i tuoi effetti collaterali. Il tuo codice sarebbe quindi simile a questo:
def foobar():
foo = get_from_database()
bar = read_from_file()
baz = read_from_s3()
if foo > 10:
return foo + bar + baz
else:
return foo - bar - baz
# And your test would look something like this:
from mockstar import prefixed_p
from nose.tools import assert_equal
ppatch = prefixed_p('module.with.foobar.func')
class TestFoobar(BaseTestCase):
@ppatch('get_from_database')
@ppatch('read_from_file')
@ppatch('read_from_s3')
def side_effects(self, se):
se.read_from_file.return_value = 10 # default behaviour
se.read_from_s3.return_value = 0 # also default behaviour
return self.invoke(se)
def test_should_get_30(self, se):
se.get_from_database.return_value = 20
# do
result = foobar()
assert_equal(result, 30)
def test_should_get_minus5(self, se):
se.get_from_database.return_value = 5
# do
result = foobar()
assert_equal(result, -5)