我发现requests_mock用作固定装置pytest适用于所有请求,即使它们没有设置。
我不确定这是一个requests_mock/pytest错误还是我遗漏了一些东西。最终,我不需要模拟“api-b”调用,但我不知道如何避免它。
def test_reqs(requests_mock):
requests_mock.get('https://api-a.com/')
requests.get('https://api-b.com/')
assert requests.get('https://api-a.com/')
Run Code Online (Sandbox Code Playgroud)
我正在使用pytest、requests-mock和pytest-mock作为 API 端点编写集成测试。在幕后,这个端点对我需要模拟的不同第三方 API 进行了多次调用。
其中一些调用可以被 嘲笑requests_mock。但其中一些不能,因为它们是从第三方模块内部进行调用的。
我尝试用pytest-mockmock最后一个发现它基本上不起作用。
requests_mock仍在尝试模拟该调用并抛出下一个错误:
requests_mock.exceptions.NoMockAddress: No mock address: GET https://api-b.com/
所以我想测试 Django 应用程序业务逻辑中的函数:
def parse_sectors_from_csv():
sectors_csv = open(os.path.join(settings.BASE_DIR, 'sector', 'fixtures', 'sectors.csv'))
sectors_csv_reader = csv.DictReader(sectors_csv)
return [
{
'model': 'sector.sector',
'id': index,
'fields': {
'name': row.get('Sector'),
'slug': slugify(row['Sector']),
'type_id': row.get('Type_Id')
}
}
for index, row in enumerate(sectors_csv_reader, 1)
]
Run Code Online (Sandbox Code Playgroud)
我已经测试了它的文件存在性和标题行的存在性。
现在我想嘲笑
open(os.path.join(settings.BASE_DIR, 'sector', 'fixtures', 'sectors.csv'))
Run Code Online (Sandbox Code Playgroud)
在我的 test.py 中我写了
with patch('__builtin__.open', mock_open(read_data=sectors_csv_mock), create=True) as m:
sectors = service.parse_sectors_from_csv()
print('Sectors:', sectors)
self.assertEqual(expected_sectors, sectors)
Run Code Online (Sandbox Code Playgroud)
但据我了解,它在打印时传递空文件来运行Sectors: []
我读了几遍mock_open dock,但仍然无法弄清楚。
>>> with patch('__main__.open', mock_open(read_data='bibble')) as m:
... with open('foo') as h: # what's happening here? …Run Code Online (Sandbox Code Playgroud)