Pytest Monkeypatch İçe Aktarılan İşlev İçin Geçerli Değildir

0

Soru

Kabaca aşağıdaki gibi ayarlanmış bir modülüm var:

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

Bu cevaba göre, işlevin gerçek içe aktarılan örneğini monkeypatch emin oldum. Başka bir yol atar "does not exist on module" hata. Ancak testi çalıştırdığımda bir hataya çarptım, çünkü orijinal işlev generate adı, monkeypatched olmasına rağmen ediliyor. Bu yamanın neden beklediğim gibi yapışmayacağını da anlayamıyorum. Bu test için Alo Yazdır "beklerdim!".

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

En iyi cevabı

0

Yolların uyuşmuyor gibi. Yaparsın from bar import coo ama setattr ile app.bar. Emin olmak için, diğer formu kullanabilirsiniz setattr bunun yerine, nesne ve öznitelik adlarını ayrı ayrı alır, örn.:

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)

Bu şekilde, doğru nesneyi yamaladığınızdan makul bir şekilde emin olabilirsiniz.

2021-11-26 20:08:33

Diğer dillerde

Bu sayfa diğer dillerde

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