测试类方法中的pytest monkeypatch.setattr()

时间:2017-02-19 19:47:37

标签: python pytest

我有一个测试类很少的测试类,我想从测试方法中修补一些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?

3 个答案:

答案 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