Тестирование поведения поддельной корзины S3 с использованием s3fs (by dask) является неожиданным - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть простая функция, которая добавляет файл в базовую папку S3.Базовое местоположение задается в качестве переменной среды:

os.environ["TEST_BASE"] = "my-bucket/testing/"

Функция:

def add_file(file):
    print(f"In function: {os.getenv('TEST_BASE')}")
    s3 = s3fs.S3FileSystem()
    s3.touch(os.getenv('TEST_BASE') + file)
    print("In function: " + str(s3.ls(os.getenv('TEST_BASE'))))

Теперь я хочу проверить ее поведение:

with mock_s3():
    with unittest.mock.patch.dict(os.environ, {"TEST_BASE": "foo/bar/"}):
        print(f"TEST_BASE = {os.getenv('TEST_BASE')}")

        s3_conn = boto3.client('s3', 'us-west-2')
        s3_conn.create_bucket(Bucket='foo')
        s3 = s3fs.S3FileSystem()
        s3.touch(os.getenv('TEST_BASE') + 'yoo')
        print(s3.ls(os.getenv("TEST_BASE")))
        add_file('goo')
        print(s3.exists(os.getenv("TEST_BASE") + 'goo'))  # (*)
        print(s3.ls(os.getenv("TEST_BASE")))  # (**)
print(f"TEST_BASE = {os.getenv('TEST_BASE')}")

Теперь часть, которую я не могу понять, состоит в том, что (*) печатает True , но (**) перечисляет только один объект (yoo).Что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В контексте unittest ing я получил следующие значения setUp и teadDown:

def setUp(self):
        self.mock_s3.start()
        s3_conn = boto3.client('s3', 'us-west-2')
        s3_conn.create_bucket(Bucket='bucket')
        self.s3 = s3fs.S3FileSystem()

def tearDown(self):
    self.mock_s3.stop()

и избежал использования декоратора.Это не помогает напрямую в случае, описанном в вопросе, но, поскольку этот вариант использования начал проблему для меня, я поместил его здесь для справки.

0 голосов
/ 03 декабря 2018

Вероятно, происходит то, что объект s3 в функции mock_s3 кэширует список каталогов по соображениям производительности.Вы создаете новый пустой файл с отдельным экземпляром, поэтому внешний экземпляр не знает, что что-то изменилось.Попробуйте вставить s3.invalidate_cache() между add_file и s3.ls.

...