我有一个测试类很少的测试类,我想从测试方法中修补一些app类和方法。 在pytest docs中,我找到了an example如何使用monkeypatch模块进行测试。例如,所有测试都只是函数,而不是测试类方法。
但我有一个有测试方法的课程:
class MyTest(TestCase):
def setUp():
pass
def test_classmethod(self, monkeypatch):
# here I want to use monkeypatch.setattr()
pass
只是将monkeypatch
作为方法参数传递显然不起作用。所以看起来像py.test魔法不能这样工作。
所以这个问题很简单,也许很愚蠢:如何在测试类方法中使用monkeypatch.setattr()
作为pytest?
答案 0 :(得分:5)
此格式can't work
虽然pytest支持通过测试函数参数接收灯具 对于非单元测试方法,unittest.TestCase方法不能 直接接收夹具函数参数作为实现 可能会造成运行一般unittest.TestCase测试的能力 套件。
您可以直接创建monkeypatch
from _pytest.monkeypatch import MonkeyPatch
class MyTest(TestCase):
def setUp():
self.monkeypatch = MonkeyPatch()
def test_classmethod(self):
self.monkeypatch.setattr ...
...
或创建自己的灯具,将monkeypatch
添加到您的班级,然后使用@pytest.mark.usefixtures
@pytest.fixture(scope="class")
def monkeypatch_for_class(request):
request.cls.monkeypatch = MonkeyPatch()
@pytest.mark.usefixtures("monkeypatch_for_class")
class MyTest(TestCase):
def setUp():
pass
def test_classmethod(self):
self.monkeypatch.setattr ...
...
答案 1 :(得分:1)
如果它是类中的方法,则第一个参数必须始终为self
(编辑:它无论如何都不起作用)。
因此,将测试定义为顶级函数:
def test_something(monkeypatch):
# or this
pass
答案 2 :(得分:0)
我有完全一样的问题。 效果很好
import unittest
import pandas as pd
from _pytest.monkeypatch import MonkeyPatch
from src.geipan_data import loadLongitudeLatitudeDateTestimony
class TestGeipanData(unittest.TestCase):
def setUp(self):
self.monkeypatch = MonkeyPatch()
def test_loadLongitudeLatitudeDateTestimony(self):
def read_csv(*args, **kwargs):
return pd.DataFrame({
'obs_date_heure': ['2010-05-21', '1926-05-21'],
'obs_1_lon': [45.123, 78.4564],
'obs_1_lat': [32.123, 98.4564],
})
self.monkeypatch.setattr(pd, 'read_csv', read_csv)
df = loadLongitudeLatitudeDateTestimony()
self.assertListEqual(
df.columns.values.tolist(),
['obs_date_heure', 'obs_1_lon', 'obs_1_lat']
)
在此示例中,我使用猴子补丁模拟了pd.read_csv方法,并使用了从unittest.TestCase扩展的asserListEqual