2012-04-12 61 views
5

我有一個測試套件(使用鼻子,而不是unittest),並且我想修補一個函數以返回測試類中每個測試的特定值序列。我第一次嘗試,用一個簡單的例子,就是:使用模擬修補功能

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

然而,MagicMock實例只創建一次,所以當副作用用完第二次測試失敗。我可以分別修補每個測試方法,但我並不想複製修補程序修飾器(比這個例子中有更多的測試!)另一種方式是我可以創建修補程序設置代碼是這樣的:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

但是保存和恢復原始函數定義看起來像是Mock應該能夠自動執行的事情。還有另一種做法,我失蹤了嗎?或者,我的最後一個例子是這樣做的最佳方式?

回答

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

輸出:1

x() 

日期:2

把你的答案到列表中。 將X改爲你想要的名字。

+0

我不知道你在這裏得到什麼。它似乎並沒有涉及到這個問題,而且看起來像是一種複雜的書寫方式'x = [1,2] .__ iter __()。next'。你想說什麼? – aquavitae 2013-05-29 09:59:10

+0

好。你想要一個方法來模擬一個函數的模擬。你現在按順序排列。沒有? x = [「Your first Response」,「Your Second Respo」,「... etc」] .__ iter __()。next 解決問題。 – Nasgar 2013-06-03 06:00:06

+0

我知道如何創建一個迭代器並模擬一個函數。我的問題是,是否有一種簡單的方法來重置每個測試功能的模擬。 – aquavitae 2013-06-03 10:15:12

1

你應該補丁只適用於每一個測試,而不是把它應用到類:

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2