Pytest Monkeypatch Nie Stosuje Się Do Importowanej Funkcji

0

Pytanie

Mam moduł skonfigurowany następująco:

# foo.py
def generate_things_based_on_other_things():
  # some nasty things here

# bar.py
from foo import generate_things_based_on_other_things as generate

def coo():
  generate()

# conftest.py
import pytest

@pytest.fixture(autouse=True)
def patch_generate(monkeypatch):
  def mock_generate():
    print("hello!")

  monkeypatch.setattr("app.bar.generate", mock_generate)

# test_bar.py
from bar import coo

def test_coo():
  coo()

Zgodnie z tą odpowiedzią nie zadbał o to, aby odwzorować rzeczywisty importowany wystąpienie funkcji. Każdy inny sposób wyrzuca "does not exist on module"błąd. Jednak, gdy uruchamiam test, spotykam się z błędem, bo pierwotna funkcja generate wywoływana, mimo, że to małpa. Ja też nie mogę zrozumieć, dlaczego ten patch nie będzie trzymać tak, jak się tego spodziewam. Spodziewam się, że ten test wydrukuje "cześć!".

monkeypatching pytest python
2021-11-23 15:16:56
1

Najlepsza odpowiedź

0

Swoje sposoby, jak się wydaje, nie są takie same. Robisz from bar import cooale użyj setattr z app.bar. Aby mieć pewność, można użyć innej formy setattr zamiast tego, który przyjmuje nazwy obiektów i atrybutów oddzielnie, np.:

import bar  # or "from app import bar", whichever is correct for you

@pytest.fixture(autouse=True)
def patch_generate(monkeypatch):
    def mock_generate():
        print("hello!")

    monkeypatch.setattr(bar, "generate", mock_generate)

W ten sposób można mieć pewność, że naprawiacie odpowiedni obiekt.

2021-11-26 20:08:33

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................