2017-02-19 193 views
2

裏面我有幾個測試方法測試類,我想從測試方法修補了一些應用程序的類和方法。 在pytest文檔中,我發現瞭如何使用monkeypatch模塊進行測試的an example。這個例子所有的測試都只是函數,而不是測試類的方法。pytest monkeypatch.setattr()測試類方法

但是我有測試方法的類:

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裏面?

回答

1

如果是類中的方法,則第一個參數必須始終爲self(編輯:它不起作用)。

所以定義測試作爲頂級函數:

def test_something(monkeypatch): 
    # or this 
    pass 
+0

對不起,忘了補充一點'self'到這個例子。我有它,但'test_classmethod(self,monkeypatch):'仍然不起作用。 – Paul

+0

噢,好的。那只是一個瘋狂的猜測,然後我不知道如何在課堂上做到這一點。它仍然會在頂層功能中工作。 – yedpodtrzitko

2

can't work以這種形式

雖然pytest支撐接收通過測試函數參數 非單元測試的測試方法夾具,方法unittest.TestCase生成不能 直接接收固定函數參數作爲執行是 可能造成在運行一般測試unittest.TestCase生成的能力0套房。

您可以創建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 ... 
    ...