Pytest Monkeypatch non si Applica Alla Funzione Importata

0

Domanda

Ho un modulo di impostare o meno come segue:

# 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()

Per questa risposta, ho fatto in modo di monkeypatch l'effettivo importato istanza della funzione. Qualsiasi altro percorso lancia un "does not exist on module"errore. Tuttavia, quando si esegue il test mi ha colpito un errore, perché la funzione originale generate viene chiamato, pur essendo monkeypatched. Io non riesco a capire perché questa patch non si attacca il modo in cui mi aspetto troppo. Mi sarei aspettato questo test print "ciao!".

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

Migliore risposta

0

I percorsi non sembrano corrispondere. Fare from bar import cooma utilizzare setattr con app.bar. Per essere sicuri, è possibile utilizzare l'altra forma di setattr invece, che prende l'oggetto e i nomi di attributo separatamente, ad esempio:

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)

In questo modo, si può essere ragionevolmente sicuri che si sono patch l'oggetto corretto.

2021-11-26 20:08:33

In altre lingue

Questa pagina è in altre lingue

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