Django:如何在 API View 中模拟类

标签 django django-rest-framework mocking django-unittest

标题可能有点令人困惑。

假设我有一个带有 post 方法的 APIView 。在 post 方法中,我引入了一个具有自己的方法的类。在本例中,它是一个处理上传到 S3 的类,这是我在运行单元测试时要跳过的内容。

class SomeView(APIView):
    def post(self):
        # do something here
        input1 = some_process(payload_arg1)
        input2 = some_other_process(payload_arg2)
        uploader = S3Uploader()
        s3_response = uploader.upload_with_aux_fxn(input1, input2)
        if s3_response['status_code'] == 200:
            # do something else
            return Response('Good job I did it!', status_code=200)
        else:
            return Response('noooo you're horrible!', status_code=400)

显然,真实代码具有不同的函数调用和响应。

现在我需要模拟 uploaderuploader.upload_with_aux_fxn 所以我实际上并不调用 S3。我如何 mock 它?

我在我的测试脚本中尝试过

from some_place import S3Uploader
class SomeViewTestCase(TestCase): 
    def setUp(self):        
        self.client = APIClient()
        uploader_mock = S3Uploader()
        uploader_mock.upload_support_doc = MagicMock(return_value={'status_code': 200, 'message': 'asdasdad'}
        response = self.client.post(url, payload, format='multipart')

但我仍然触发了 S3 上传(如文件显示在 S3 中)。我如何正确地模拟这个?

编辑1:

我尝试修补

def setUp(self):
    self.factory = APIRequestFactory()
    self.view = ViewToTest.as_view()
    self.url = reverse('some_url')


@patch('some_place.S3Uploader', FakeUploader)
def test_uplaod(self):
    payload = {'some': 'data', 'other': 'stuff'}
    request = self.factory.post(self.url, payload, format='json')
    force_authenticate(request, user=self.user)
    response = self.view(request)

FakeUplaoder 的位置

class FakeUplaoder(object):
    def __init__(self):
        pass
    def upload_something(self, data, arg1, arg2, arg3):
        return {'status_code': 200, 'message': 'unit test', 's3_path': 
                'unit/test/path.pdf'}

    def downlaod_something(self, s3_path):
        return {'status_code': 200, 'message': '', 'body': 'some base64 
                stuff'}

不幸的是,这没有成功。我还是上了实际课

编辑2:

我正在使用 Django 1.11 和 Python 2.7,以防人们需要此信息

最佳答案

我猜正确的方法是将文件保存在带有 FileField 的模型中,然后连接 Boto 来处理生产场景中的上传。
仔细看看:
https://docs.djangoproject.com/en/2.2/ref/models/fields/#filefield

https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#model
这种方法将保留 Django 默认行为,使 Django 的默认测试客户端更易于测试。

关于Django:如何在 API View 中模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56907331/

相关文章:

sql - PostgreSQL 中的 IN 语句性能(以及一般)

python - Django Rest 框架和 JSONField

unit-testing - Rhino Mocks : Stub & Mocks. 有什么区别

javascript - 如何在带有 django 后端的单页应用程序上实现 twitter oauth2

带有 Controller 重定向的 Spring MVC 测试发布方法

java - WireMock 是否支持关联?

python - django 上下文处理器 - 如何从一个函数返回所有内容?

python - 从 Django 1.4 升级到 1.6 后在管理中保存对象时列出索引超出范围错误

html - 如何跨页面保留 url 参数

django - 我无法更改 django drf 中的日期格式