forked from joeheyming/redef
-
Notifications
You must be signed in to change notification settings - Fork 0
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.
msabramo/redef
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
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 0
No packages published