2017-06-23 94 views
1

我不知道爲什麼mock_s3修飾器在用作pytest夾具的裝飾器時不起作用。 test_with_fixture失敗,它提供與test_without夾具相同的代碼。那麼,它是明確裝飾的「相同」。mock_s3裝飾pytest夾具

test_with_fixture引發AccessDenied錯誤,但S3錯誤的類型在這種情況下不相關。問題在於,client.list_objects在使用fixture的測試中沒有被模擬。

pytest - 3.1.2
摩托 - 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) 

回答

1

您的夾具的問題是,你是不是以後使用它,雖然它是在你的測試簽名test_with_fixture(moto_boto)。我建議你創建一個fixture來返回一個函數,該函數可以在你的測試中被實例化,以創建你的測試需要的模擬對象(s3桶)。這樣的實現方式的一個例子可以如下:

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) 

在這種情況下,我使用的摩托庫通過在夾具兩者和測試,但上下文管理器一個裝飾可類似地用作moto README解釋

1

另一種方法是使用autouse測試夾具,在其中啓動和停止moto服務器並創建測試存儲桶。這是基於mikegrima對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)