main.py
Код: Выделить всё
import concurrent.futures
import elasticsearch
class ThreadTest:
def __init__(self):
pass
def process(self):
futures = []
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
future = executor.submit(
self.just_es,
)
futures.append(future)
concurrent.futures.wait(fs=futures)
for future in futures:
result = future.result()
def just_es(self):
print(elasticsearch.Elasticsearch) # I want this to be mocked
return "hey"
Код: Выделить всё
import elasticsearch
import pytest
from main import ThreadTest
class MockElasticsearchClient:
def __init__(self):
pass
@property
def meta(self):
return
@pytest.fixture(autouse=True)
def mock_es(monkeypatch):
def fake_es_client_6_for_run_query(*args, **kwargs):
return MockElasticsearchClient()
monkeypatch.setattr(
elasticsearch,
"Elasticsearch",
fake_es_client_6_for_run_query,
)
def test_thread(monkeypatch, mock_es):
tt = ThreadTest()
tt.just_es() # This works
tt.process() # This doesn't work, Elasticsearch is not mocked in subprocesses
Код: Выделить всё
# output by just_es()
# output by process which internally calls just_es()
Что еще я пробовал:
Я пробовал использовать инициализатор с ProcessPoolExecutor для применения макета, но макет по-прежнему не применяется в подпроцессах.
Подробнее здесь: https://stackoverflow.com/questions/793 ... n-here-ela