Override Python Function-local Variable In Unittest
Solution 1:
You can't mock a function's local variable. To make your code easier to test, change it to, e.g:
defkeep_trying(self, timeout=300):
end_time = time.time() + timeout
# etc, as above
so it becomes trivial for tests to run it with a shorter timeout!
Solution 2:
Rather than trying to mock the value if timeout
, you'll want to mock the return value of time.time()
.
e.g.
@patch.object(time, 'time')deftest_keep_trying(self, mock_time):
mock_time.side_effect = iter([100, 200, 300, 400, 500, 600, 700, 800])
...
Now the first time time.time()
is called, you'll get the value of 100, so it should timeout when after a few turns of your while loop. You can also mock time.sleep
and just count how many times it gets called to make sure that part of the code is working properly.
Another approach (which isn't completely orthogonal to the one above) is to allow the user to pass an optional timeout keyword to the function:
defkeep_trying(self, timeout=300):
...
This allows you to specify whatever timeout you want in the tests (and in future code which doesn't want to wait 5 minutes ;-).
Post a Comment for "Override Python Function-local Variable In Unittest"