Amazon s3 如何使用pytest(flask+;mongo+;s3)实现这一点

Amazon s3 如何使用pytest(flask+;mongo+;s3)实现这一点,amazon-s3,mocking,pytest,boto3,Amazon S3,Mocking,Pytest,Boto3,我有一个flask方法,这个flask方法调用一个函数,从s3 bucket和mongo数据库加载数据,然后这些操作和返回 问题:当使用Flask test_client()调用端点时,它仍然尝试使用真实的数据库和s3 bucket 项目结构看起来有点像: +-- main | +-- s3_data_access | +--- pull_data.py | +-- mongo_data_access | +--- read_collection.py | +--

我有一个flask方法,这个flask方法调用一个函数,从s3 bucket和mongo数据库加载数据,然后这些操作和返回

问题:当使用Flask test_client()调用端点时,它仍然尝试使用真实的数据库和s3 bucket

项目结构看起来有点像:

+-- main
|   +-- s3_data_access
|      +--- pull_data.py
|   +-- mongo_data_access
|      +--- read_collection.py
|  +-- controller
|      +-- flask_app.py
+-- test
|   +-- flask_app_tests.py
main/s3\u data\u access/pull\u data.py

import boto3

def pull_data(str_date)
        s3_client=boto3.client('s3')
        data=s3_client.get_object(Bucket=self.bucket_name,Key=str_date)
        return data
from pymongo import MongoClient

    def read_data(timestamp):
        coll=MongoClient(os.environ['URI'])[db][collection]
        return coll.find({'ts':timestamp})
from flask_restplus import Resource
from flask import request
from main.s3_data_access import pull_data
from main.mongo_data_access import read_data

class UserListConfirmation(Resource):

@api.route("/daily_pull/transaction/<timestamp>/<str_date>")
def get(self):
   s3_data=pull_data(str_date)
   mongo_data=read_data(timestamp)
   return _do_x(s3_data,mongo_data)

def _do_x(s3,mongo):
    #does some operations
main/mongo\u data\u access/read\u collection.py

import boto3

def pull_data(str_date)
        s3_client=boto3.client('s3')
        data=s3_client.get_object(Bucket=self.bucket_name,Key=str_date)
        return data
from pymongo import MongoClient

    def read_data(timestamp):
        coll=MongoClient(os.environ['URI'])[db][collection]
        return coll.find({'ts':timestamp})
from flask_restplus import Resource
from flask import request
from main.s3_data_access import pull_data
from main.mongo_data_access import read_data

class UserListConfirmation(Resource):

@api.route("/daily_pull/transaction/<timestamp>/<str_date>")
def get(self):
   s3_data=pull_data(str_date)
   mongo_data=read_data(timestamp)
   return _do_x(s3_data,mongo_data)

def _do_x(s3,mongo):
    #does some operations
main/controller/flask_app.py

import boto3

def pull_data(str_date)
        s3_client=boto3.client('s3')
        data=s3_client.get_object(Bucket=self.bucket_name,Key=str_date)
        return data
from pymongo import MongoClient

    def read_data(timestamp):
        coll=MongoClient(os.environ['URI'])[db][collection]
        return coll.find({'ts':timestamp})
from flask_restplus import Resource
from flask import request
from main.s3_data_access import pull_data
from main.mongo_data_access import read_data

class UserListConfirmation(Resource):

@api.route("/daily_pull/transaction/<timestamp>/<str_date>")
def get(self):
   s3_data=pull_data(str_date)
   mongo_data=read_data(timestamp)
   return _do_x(s3_data,mongo_data)

def _do_x(s3,mongo):
    #does some operations
来自flask_restplus导入资源
从烧瓶进口请求
从main.s3_数据访问导入拉取数据
从main.mongo_数据访问导入读取数据
类UserListConfirmation(资源):
@api.route(“/daily\u pull/transaction/”)
def get(自我):
s3\u数据=拉取数据(str\u日期)
mongo_数据=读取_数据(时间戳)
返回_do_x(s3_数据、mongo_数据)
def_do_x(s3,mongo):
#做一些手术
理想情况下,我想模拟上一个文件/daily_pull/transaction//中的调用,但在浏览互联网后,我感到非常失落

为flask应用程序创建了一个app.test_client()并访问了CRUD,但他们试图访问生产资源(S3和mongo),因此我想了解两件事:

  • 在运行get()时,如何使test_client()方法使用模拟的mongodb和s3来代替真实的方法

  • 有更好的方法吗