I have a class based on the django class that I decorate. Unfortunately, this decorator makes external calls to check status, which goes beyond what unit test should do. I want to override the decorator so that I donβt do anything during my unit tests. Here is my decorator:
decorators.py
def status_check(func): @wraps(func) def wrapped(request, *args, **kwargs): uri = settings.SERVER_URI status_code = None bad_status = [404, 500] try: response = requests.head(uri) except requests.ConnectionError as err: LOGGER.error('Server is hosed! Oh Noes! Error: %s ' % (err)) raise Http404 except Exception as err: LOGGER.error('Some crazy stuff is happening. Its Bad. ' 'Error: %s' % (err)) raise Http404 status_code = response.status_code if not status_code or status_code in bad_status: LOGGER.error('Awww Snap! Server is not happy: %s' % (status_code)) raise Http404 return func(request, *args, **kwargs) return wrapped
views.py
class HandleFoo(DetailView): @method_decorator(status_check) def post(self, request):
tests.py
class RunTest(TestCase): def test_post(self): post_data = json.dumps({'stuff': 'vodka', 'things': 'tonic'}) resp = self.client.post(self.foo_uri, post_data, content_type='application/json', ) self.assertEqual(resp.status_code, 200)
So, is there a way for me to either redefine the decorator or bypass it at all? I'm pretty dumb on this one.
EDIT Tried to mock a query using the following from krak3n:
@patch('app.views.method_decorator.status_check', lambda func: func) @patch('app.views.status_check', lambda func: func) @patch('app.decorators.status_check', lambda func: func) @patch('app.views.HandleFoo.post', lambda func: func)
The last method brings me to the nearest point, but in the end it throws the stack:
Traceback (most recent call last): File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/mock.py", line 1201, in patched return func(*args, **keywargs) File "/Users/squiddly/projects/tests/app/tests.py", line 165, in test_post content_type='application/json', File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/client.py", line 463, in post response = super(Client, self).post(path, data=data, content_type=content_type, **extra) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/client.py", line 297, in post return self.request(**r) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/client.py", line 406, in request response = self.handler(environ) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/client.py", line 111, in __call__ response = self.get_response(request) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 178, in get_response response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 224, in handle_uncaught_exception return callback(request, **param_dict) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/utils/decorators.py", line 91, in _wrapped_view response = view_func(request, *args, **kwargs) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/views/defaults.py", line 41, in server_error return http.HttpResponseServerError(template.render(Context({}))) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/base.py", line 140, in render return self._render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/utils.py", line 65, in instrumented_test_render return self.nodelist.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/base.py", line 830, in render bit = self.render_node(node, context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node return node.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/loader_tags.py", line 124, in render return compiled_parent._render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/utils.py", line 65, in instrumented_test_render return self.nodelist.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/base.py", line 830, in render bit = self.render_node(node, context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node return node.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/loader_tags.py", line 156, in render return self.render_template(self.template, context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/loader_tags.py", line 138, in render_template output = template.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/base.py", line 140, in render return self._render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/test/utils.py", line 65, in instrumented_test_render return self.nodelist.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/base.py", line 830, in render bit = self.render_node(node, context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node return node.render(context) File "/Users/squiddly/envs/testenv/lib/python2.7/site-packages/django/template/base.py", line 1185, in render _dict = func(*resolved_args, **resolved_kwargs) File "/Users/squiddly/projects/tests/app/templatetags/app_extras.py", line 40, in get_data if request.session.has_key('start_time'): AttributeError: 'str' object has no attribute 'session'