¿Cómo podemos simular la carga de archivos en S3. Intenté algo como esto.
file_mock = mock.MagicMock(spec=File, name='FileMock') @mock.patch('storages.backends.s3boto.S3BotoStorage', FileSystemStorage) def test_post_file(self): response = self.client.post('/api/v1/file_upload/', { "status": "NEW", "amount": "250.00", "bill": file_mock })Pero esto, a su vez, se está cargando en S3. Soy nuevo en esto. ¿Cómo se puede implementar esto sin cargar archivos en S3?
Entonces, su enfoque general es correcto, pero debe anular el comportamiento de boto. Por lo tanto, debe crear varios parches para ello. Algo como esto probablemente funcionaría:
""" Mock Connection class for Bucket """ class MockConnection(): def __init__(self): self.provider = 'AWS' def delete_key(self, param): pass """ Mock Connection class which is called for connecting to s3 """ class MockS3Connection(): def get_bucket(self, name, validate=False): return Bucket(MockConnection(), 'bucket') """ Mock Key class which also gets the bucket """ class MockKey(): def __init__(self, bucket): self.bucket = bucket def set_contents_from_string(self, data, headers): pass def set_acl(self, read): pass """ Mock the function which connects to S3 """ def mock_connect_s3(): return MockS3Connection() class TestUploadResource(BaseResourceTestCase): """ Test Document upload """ def setUp(self): super(TestUploadResource, self).setUp() @mock.patch('boto.connect_s3', new = mock_connect_s3) @mock.patch("boto.s3.key.Key", MockKey) def test_file_is_accepted(self): ''' Test case to check whether file is uploaded ''' name = raw_input('Document1')+'.pdf' file = open(name,'rw') # Trying to create a new file or open one """ Call the upload docs command with the file which we want to save """ response = self.client.post('some-url') """ Check whether the file is going and the response of creation is coming or not """ self.assertEqual(201, response.status_code)Luego puede agregar varias cosas en su función como cuál sería el comportamiento esperado. Espero que esto ayude.
La solución anterior funcionó. También tuve que burlarme del método de guardado.
@mock.patch.object(<Model>, 'save') @mock.patch('boto.connect_s3', new=mock_connect_s3) @mock.patch("boto.s3.key.Key", MockKey) def test_post_file(self, save_mock): response = self.client.post('/api/v1/file_upload/', { "status": "NEW", "amount": "250.00", "bill": file_mock }) self.assertTrue(save_mock.called) self.assertEqual(201, response.status_code)Después de mucha investigación, la solución más simple que he encontrado hasta ahora es parchear setUp en el método de configuración o incluso en la parte superior de los archivos de prueba.
Ejemplo:
from django.core.files.storage import FileSystemStorage from myapp.models import Report class TestUploadS3(TestCase): def setUp(self): ... Report.pdf_file.field.storage = FileSystemStorage() ...De esta forma, el archivo no se carga en S3.