Например, у меня есть такая логика на стороне тестов в Django:
from rest_framework.test import APITestCase, APIClient
import unittest
from mock import patch
from rest_framework.reverse import reverse
from rest_framework import status
from django.test import TestCase
from django.contrib.auth.models import User
class APITest(unittest.TestCase):
def setUp(self):
self.client = APIClient(enforce_csrf_checks=False)
self.user = User.objects.create_user('test_user', 'test_user@test.com', 'password')
self.user.save()
def test_auth_get(self):
with patch('app.views.RabbitMq.run_rabbitmq'):
self.client.login(username='test_user', password='password')
self.client.force_authenticate(user=self.user)
response = self.client.get(reverse('user-list'), format='json')
print response
self.assertEqual(response.status_code, 200)
в соответствии с urls.py:
from django.conf.urls import patterns, include, url
from rest_framework import routers
from views import UserViewSet, GroupViewSet
router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'groups', GroupViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
и я хочу наложить mock на run_rabbitmq во views.py:
from django.contrib.auth.models import User, Group
import pika
from django.http import HttpResponse
from rest_framework import viewsets
from serializers import UserSerializer, GroupSerializer
class RabbitMq:
def __init__(self):
pass
def run_rabbitmq(self):
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='test')
channel.basic_publish(exchange='', routing_key='test', body='Hello World!')
connection.close()
def rabbitmq_wrap(OriginalClass):
orig_init = OriginalClass.__init__
def __init__(self, *args, **kws):
rabbit = RabbitMq()
rabbit.run_rabbitmq()
orig_init(self, *args, **kws)
OriginalClass.__init__ = __init__
return OriginalClass
@rabbitmq_wrap
class Record:
def __init__(self):
pass # here is the logic of writing to database
class UserViewSet(viewsets.ModelViewSet, Rabbitmq):
record = Record()
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
def my_view(request):
return HttpResponse('<h1>Hello!</h1>')
таким образом, чтобы он просто ничего не делал, не возвращал ничего и не производил никакие соединения (в моём случае нужно делать запись в базу во время теста без отправки сообщения в очередь rabbitmq).
Учитывая вот это:
https://docs.python.org/3/library/unittest.mock.ht...
как мне наложить patch на инстанс класса внутри декоратора?