Skip to content
/ redef Public
forked from joeheyming/redef

Python module to redefine a function/attribute of a module that will reset after going out of scope. You can redef any attribute of an object. You can also capture input to a redefined function, and other stats. This tool was inspired by http://search.cpan.org/~airwave/Test-Resub-1.02/lib/Test/Resub.pm See the test_redef.py for examples.

Notifications You must be signed in to change notification settings

msabramo/redef

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

To install, just run:
python ./setup.py build
python ./setup.py install

See test_redef.py under your install path for examples.

Redef is inteded to create lexically scope variables that when destroyed undo mock behavior.
It was inspired by a perl module, Test::Resub - http://search.cpan.org/~airwave/Test-Resub-1.02/lib/Test/Resub.pm

The best examples use unittest, but it should work with any testing framework.

import unittest
from redef import redef

class MyClass:
      def lame_function(self):
          return "something I don't want"

def MyTest(unittest.TestCase):
    def test1(self):
        myobj = MyClass()
        self.assertEqual(myobj.lame_function(), "something I don't want")
        want = 'something I want'
        rd_lf = redef(MyClass, 'lame_function', lambda s: want)
        self.assertEqual(myobj.lame_function(), want)

        # after test1, rd_lf gets deleted and resets

    def test2(self):        
        myobj = MyClass()
        # test2 is uneffected by test1
        self.assertEqual(myobj.lame_function(), "something I don't want")

This doesn't have to be a function, you can also redefine attributes directly on an object.

class MyClass:
      unpredictable = 'random string'

my_global_object = MyClass()
...
     def test3(self):
         rd_u = redef(my_global_object, 'unpredictable', 'unit testable string')
         # ... test something awesome!
         self.assertEqual(my_global_object.unpredictable, 'unit testable string')
     def test4(self):
         # hey, my_global_object is back to being unpredictable
         self.assertEqual(my_global_object.unpredictable, 'unpredictable')
         
There are other useful functions provided on the redef object itself:
Class Redef:

called():
        Stores how many times a redef'd function was called.
method_args():
        Stores the most recent *args to the redef'd function.
named_method_args():
        Stores the most recent **kwargs to the redef'd function.

reset():
        Sets called, method_args, and name_method_args back to the default state of 0, None, None

Redef also provides a freebie static functions:
redef(obj, key, value):
        Static constructor of a Redef object

# these static functions were provieded to show the usefulness of redef: 
#   for example, you could capture stdout of a function call, and after capturing it,
#   sys.stdout goes back to normal
Class WriteCapturer:
    Has 2 variables you want: output, returned

stdout_of(func, *args, **kwargs):
        Call a function and capture the stdout
        Returns a WriteCapturerobject that has the stdout and the return value of calling func

stderr_of(func, *args, **kwargs):
        Call a function and capture the stderr
        Returns a WriteCapturerobject that has the stderr and the return value of calling func
        

About

Python module to redefine a function/attribute of a module that will reset after going out of scope. You can redef any attribute of an object. You can also capture input to a redefined function, and other stats. This tool was inspired by http://search.cpan.org/~airwave/Test-Resub-1.02/lib/Test/Resub.pm See the test_redef.py for examples.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published