2017-06-23 6 views
1

Je me demande pourquoi le décorateur mock_s3 ne fonctionne pas lorsqu'il est utilisé comme décorateur pour luminaire pyest. test_with_fixture échoue alors qu'il fournit le même code que le luminaire test_without. Eh bien, "la même" qu'elle est décorée explicitement.mock_s3 décoration pytest luminaire

test_with_fixture soulève AccessDenied erreur, mais le type d'erreur S3 n'est pas pertinent dans ce cas. Le problème est que, client.list_objects n'est pas raillé dans le test qui utilise fixture.

pytest - 3.1.2
moto - 1.0.1
boto3 - 1.0.4

import pytest 
import boto3 

from moto import mock_s3 

BUCKET = 'Foo' 


@pytest.fixture() 
@mock_s3 
def moto_boto(): 
    res = boto3.resource('s3') 
    res.create_bucket(Bucket=BUCKET) 


def test_with_fixture(moto_boto): 
    client = boto3.client('s3') 
    client.list_objects(Bucket=BUCKET) 


@mock_s3 
def test_without_fixture():  
    res = boto3.resource('s3') 
    res.create_bucket(Bucket=BUCKET) 

    client = boto3.client('s3') 
    client.list_objects(Bucket=BUCKET) 

Répondre

1

Le problème de votre appareil est que vous ne l'utilisez pas plus tard bien qu'il soit dans la signature de votre test test_with_fixture(moto_boto). Je vous suggère de créer un appareil qui renvoie une fonction qui peut être instanciée dans votre test pour créer les objets simulés dont votre test a besoin (le s3 seau). Un exemple d'une telle mise en œuvre pourrait être la suivante:

import pytest 
import boto3 

from moto import mock_s3 

BUCKET = 'Foo' 

@pytest.fixture() 
def moto_boto(): 
    @mock_s3 
    def boto_resource(): 
     res = boto3.resource('s3') 
     res.create_bucket(Bucket=BUCKET) 
     return res 
    return boto_resource 

@mock_s3 
def test_with_fixture(moto_boto): 
     moto_boto() 
     client = boto3.client('s3') 
     client.list_objects(Bucket=BUCKET) 

Dans ce cas, j'utilise la bibliothèque de moto par un décorateur à la fois l'appareil et le test, mais le gestionnaire de contexte pourrait être tout aussi utilisé comme expliqué dans la moto README

1

Une alternative consiste à utiliser une unité de test Autouse dans laquelle vous démarrez et arrêtez le serveur moto et créez votre compartiment de test. Ceci est basé sur le commentaire de mikegrima sur https://github.com/spulec/moto/issues/620.

import pytest 
import boto3 

from moto import mock_s3 

BUCKET = 'Foo' 


@pytest.fixture(autouse=True) 
def moto_boto(): 
    # setup: start moto server and create the bucket 
    mock_s3().start() 
    res = boto3.resource('s3') 
    res.create_bucket(Bucket=BUCKET) 
    yield 
    # teardown: stop moto server 
    mock_s3.stop() 


def test_with_fixture(): 
    client = boto3.client('s3') 
    client.list_objects(Bucket=BUCKET)