0

当我单独运行以下测试时,它通过了。但是当我用其他测试运行它时,即使这个测试是第一个运行它也会失败:


from runpy import run_path
from unittest.mock import patch, MagicMock

@patch('boto3.client', autospec=True)
def test_scripts(mock_boto3_client: MagicMock):
    mock_boto3_client().head_object.return_value = {}
    run_path(
      'src/scripts/dynamic_script.py',
      run_name='__main__'
    )

这似乎以某种方式受到其他模拟或导入的影响,但尚不清楚当它首先运行时它们将如何影响该测试

4

1 回答 1

0

最终想通了。这是由于工作方式mock.patch。这是一个很好的解释:

https://nedbatchelder.com/blog/201908/why_your_mock_doesnt_work.html

让这更难理解的原因runpy是,当我们只运行这个测试时,即使补丁名称不正确,补丁也能正常工作。这可能是因为补丁是在导入之前完成的(导入是在 期间动态发生的run_path),所以到时候from/import,补丁已经在内存中了,我们得到了指向 mock 的指针。

当我们在其他测试的上下文中运行测试时,导入树包括用 定义的原始库from boto3 import client,所以这个导入可能在应用补丁之前就在内存中。

解决方案是确保对模拟实体的所有引用仅通过 using 来全名import boto3,或者在测试模块内模拟名称。

于 2021-07-22T18:55:43.957 回答