首页 > 解决方案 > 如何在 Visual Studio Code 中为 Python 中的测试设置根目录?

问题描述

project\
  src\
      __init__.py  
  tests\
      __init__.py
      stubs\r_json_response_expired.json

在我的测试中,我必须加载一个 JSON 文件。这个。

@patch('requests.post')
def test_subscription_delete_only_if_invalid(self, mock_post):
    with app.app_context():
        expires_at = datetime.utcnow()
        m = self.inject_expired_r_json()

def inject_expired_r_json(self):
        with open('stubs/r_json_response_expired.json') as fb_file:
            receipt_response = json.load(fb_file)
        m = MagicMock()
        m.json = MagicMock(name='json')
        m.json.return_value = receipt_response
        return m

运行测试 VS Code 时显示:

FileNotFoundError:[Errno 2] 没有这样的文件或目录:'stubs/r_json_response_expired.json'

.env的项目中有:

PYTHONPATH=./src

在 settings.json (VS CODE)

"terminal.integrated.env.osx": {
    "PYTHONPATH": "${workspaceFolder}/src"
},
"python.envFile": "${workspaceFolder}/.env"

如果我碰巧切换了 IDE,我不喜欢更改测试中的路径以避免破坏 PyCharm。

标签: pythonvisual-studio-codeconfiguration

解决方案


问题是您的测试运行时的当前目录是您的工作区根目录,project. 可能您最好的选择是使用importlib_resources来读取文件。如果将__init__.py文件放在存根中,则可以将 JSON 文件读取为:

import importlib_resources

from . import stubs

data = importlib_resources.files(stubs).joinpath('r_json_response_expired.json').read_text()

如果由于某种原因您不能__init__.py在目录中放置一个,那么您可以使用 pathlib 创建文件路径。

import pathlib

data_path = pathlib.Path(__file__).parent / "stubs" / "r_json_response_expired.json"
data = data_path.read_text(encoding="utf-8")

推荐阅读