commit 478ba3a44f3291367eeaea9ba9ce0f4cab24f517 Author: Damian Johnson atagar@torproject.org Date: Sat Feb 23 11:49:02 2013 -0800
Cleaning up 'The Little Engine that Could' tutorial test
Of all our tests the tutorial example tests stick out as being... just aweful. They work I guess but their mix of heavy mocking and the example being tested is both damn confusing and unmaintainable.
Breaking it up so the mocking is entirely separate from the tutorial code. --- docs/tutorial/the_little_relay_that_could.rst | 2 +- test/mocking.py | 12 ++++++--- test/unit/tutorial.py | 32 +++++++++++++++--------- 3 files changed, 29 insertions(+), 17 deletions(-)
diff --git a/docs/tutorial/the_little_relay_that_could.rst b/docs/tutorial/the_little_relay_that_could.rst index 5f85f6e..e3f42d0 100644 --- a/docs/tutorial/the_little_relay_that_could.rst +++ b/docs/tutorial/the_little_relay_that_could.rst @@ -49,7 +49,7 @@ many bytes Tor has sent and received... from stem.control import Controller
with Controller.from_port(control_port = 9051) as controller: - controller.authenticate() # provide the password here if you set one + controller.authenticate() # provide the password here if you set one
bytes_read = controller.get_info("traffic/read") bytes_written = controller.get_info("traffic/written") diff --git a/test/mocking.py b/test/mocking.py index 3ee8f08..9ed3fbb 100644 --- a/test/mocking.py +++ b/test/mocking.py @@ -204,14 +204,14 @@ NETWORK_STATUS_DOCUMENT_FOOTER = (
def no_op(): - def _no_op(*args): + def _no_op(*args, **kwargs): pass
return _no_op
def return_value(value): - def _return_value(*args): + def _return_value(*args, **kwargs): return value
return _return_value @@ -318,7 +318,7 @@ def support_with(obj): return obj
-def mock(target, mock_call, target_module=None): +def mock(target, mock_call, target_module = None, is_static = False): """ Mocks the given function, saving the initial implementation so it can be reverted later. @@ -331,6 +331,7 @@ def mock(target, mock_call, target_module=None): :param function target: function to be mocked :param functor mock_call: mocking to replace the function with :param module target_module: module that this is mocking, this defaults to the inspected value + :param bool is_static: handles this like a static method of the target_module if True """
if hasattr(target, "mock_id"): @@ -349,7 +350,10 @@ def mock(target, mock_call, target_module=None):
# mocks the function with this wrapper
- setattr(target_module, target_function, mock_wrapper) + if is_static: + setattr(target_module, target_function, staticmethod(mock_wrapper)) + else: + setattr(target_module, target_function, mock_wrapper)
def mock_method(target_class, method_name, mock_call): diff --git a/test/unit/tutorial.py b/test/unit/tutorial.py index 21db41b..7d79eb2 100644 --- a/test/unit/tutorial.py +++ b/test/unit/tutorial.py @@ -8,6 +8,7 @@ import StringIO import sys import unittest
+from stem.control import Controller from test import mocking
@@ -23,27 +24,34 @@ class TestTutorial(unittest.TestCase): sys.stdout = self.stdout_real
def test_the_little_relay_that_could(self): - from stem.control import Controller + def tutorial_example(): + from stem.control import Controller + + with Controller.from_port(control_port = 9051) as controller: + controller.authenticate() # provide the password here if you set one + + bytes_read = controller.get_info("traffic/read") + bytes_written = controller.get_info("traffic/written") + + print "My Tor relay has read %s bytes and written %s." % (bytes_read, bytes_written)
controller = mocking.get_object(Controller, { 'authenticate': mocking.no_op(), 'close': mocking.no_op(), 'get_info': mocking.return_for_args({ - ('traffic/read',): '1234', - ('traffic/written',): '5678', + ('traffic/read',): '33406', + ('traffic/written',): '29649', }, is_method = True), })
- controller.authenticate() - - bytes_read = controller.get_info("traffic/read") - bytes_written = controller.get_info("traffic/written") - - print "My Tor relay has read %s bytes and written %s." % (bytes_read, bytes_written) - - controller.close() + mocking.mock( + Controller.from_port, mocking.return_value(controller), + target_module = Controller, + is_static = True, + )
- self.assertEqual("My Tor relay has read 1234 bytes and written 5678.\n", self.stdout.getvalue()) + tutorial_example() + self.assertEqual("My Tor relay has read 33406 bytes and written 29649.\n", self.stdout.getvalue())
def test_mirror_mirror_on_the_wall(self): from stem.descriptor.server_descriptor import RelayDescriptor
tor-commits@lists.torproject.org