模拟自定义文件存储后端

use*_*661 5 django unit-testing amazon-s3

我创建了一个自定义文件存储后端,该后端使用boto调出到Amazon S3并将文件存储在其中(我知道django-storages也可以解决此问题,但是我们遇到了一些问题)。我将其存储在utils模块中,并在我的模型中使用它,如下所示:

from utils.s3 import S3Storage

class Photo(models.Model):
  image = models.ImageField(storage=S3Storage(), upload_to="images")
Run Code Online (Sandbox Code Playgroud)

因此,每当使用图像文件创建照片时,图像文件都会上传到S3存储桶。

我不想在测试期间向S3发出呼叫,但是要弄清楚在这种情况下要模拟的内容非常困难。我无法模拟整个图像字段,因为我需要通过Tastypie测试创建模型。

有任何想法吗?

Man*_*Tai 5

您可以在类中模拟该_save方法S3Storage,以避免上传到 S3。你可以用FileSystemStorage它代替。

我对你的情况的解决方案是这样的:

import mock
from utils.s3 import S3Storage
from django.core.files.storage import FileSystemStorage


fss = FileSystemStorage()

@mock.patch.object(S3Storage, '_save', fss._save)
def test_something():
    assert True
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用带有返回值的模拟,而不是使用真正的`_save`方法: ```@patch.object(GoogleCloudMediaStorage, '_save', MagicMock(return_value='/tmp/plain.pdf'))``` (2认同)