2

我有以下功能。

def test_download(test_args):
    mock = mock_s3()
    mock.start()
    conn = boto3.resource('s3', region_name='us-west-2')
    conn.create_bucket(Bucket=test_args.source_bucket)
    s3.Object(test_args.source_bucket, 'testing.txt').put(
        Body=open("testing.txt", 'rb'))
    handler_client = HandlerClient(test_args)
    handler_client.get_s3_file()

使用from moto import mock_s3

当我去测试时,我得到了错误。

    def add_auth(self, request):
        if self.credentials is None:
>           raise NoCredentialsError
E           botocore.exceptions.NoCredentialsError: Unable to locate credentials at line
>       `conn.create_bucket(Bucket=test_args.source_bucket)`

我已经尝试过装饰器以及

with moto.mock_s3():

都得到相同的错误。我怎样才能解决这个问题来创建一个假的桶把一个项目放在里面。

4

1 回答 1

6

moto不幸的是,它没有模拟boto3. 因此,您需要设置 AWS 授权链的某些部分,例如导出AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY. 我们通常会在每次测试之前设置一个fixture来更新环境:

@pytest.fixture(scope='function')
def context():
    context = attrdict.AttrMap()
    orig_env = os.environ.copy()
    os.environ['AWS_ACCESS_KEY_ID'] = 'foo'
    os.environ['AWS_SECRET_ACCESS_KEY'] = 'bar'
    context.os = {'environ': os.environ}
    yield context
    os.environ = orig_env

导入部分是设置AWS_ACCESS_KEY_IDand AWS_SECRET_ACCESS_KEY,然后yielding ,然后恢复os.environ到原来的状态。您不必使用该context = attrdict.AttrMap部件,我们喜欢这样,因此使用此夹具的测试功能可以访问测试os.environ(和其他测试)属性。

于 2019-01-29T18:31:36.323 回答