首页 > 解决方案 > 如何模拟`s3fs.FileSystem().glob`?

问题描述

我有一个功能,其中包括以下内容:

FS = s3fs.S3FileSystem()

def my_function(s3_path: str):
    files = FS.glob('s3://'+s3_path)

它列出了 AWS S3 上与某个字符串匹配的所有文件s3_path,然后(稍后)下载它们。

在测试这个功能时,我不想每次都连接到 AWS S3。但我确实想检查我下载的文件会发生什么。

因此,我在本地创建了一个名为testinputs. 在这里,我复制了我在 AWS S3 上的一些文件。

然后我的想法是模拟FS.glob(s3_path)调用,以便它返回输出

import glob

glob.glob(os.path.join('testinputs', s3_path))

我怎样才能做到这一点?我试过用mockfromunittest来写:

from unittest import mock

def test_my_function():
    with mock.patch('s3fs.S3FileSystem') as mock_fs:
        mock_fs.glob = glob.glob
        my_function('<SOME FILE PATH>')

但这似乎并没有改变的行为FS.glob

标签: pythonamazon-web-servicestestingmocking

解决方案


终于明白了:

import pytest
from glob import glob

def test_my_function(monkeypatch):
    monkeypatch.setattr(mypackage.myfile.FS, "glob", glob)
    my_function('<SOME FILE PATH>')

推荐阅读