在爲我的應用程序編寫單元測試時,我一直使用@mock.patch
和@patch.object
裝飾器。但是現在,當我使用裝飾器進行一些單元測試時,我收到一個錯誤'TypeError:靜態方法對象不是迭代器'。在Python中使用'@ patch.object'和'with patch.object'有什麼區別?
但使用相同的代碼,如果我使用mock.patch.object
或mock.patch.object
,一切正常。
例如,在我的測試類我有這樣的方法:
@staticmethod
def my_mock():
...do something
當我嘗試以下的單元測試
@mock.patch('mypackage.mymodule.my_method', side_effect=my_mock)
def test_something(self, my_method_mocked):
...test something
我接收之前'類型錯誤規定錯誤消息:靜態方法對象不是迭代器'。
但是當我嘗試這樣
def test_something(self):
with patch.object(mymodule, "my_method") as mocked_method:
mocked_method.side_effect = self.my_mock
...test something
然後一切完美的作品。
我讀過關於模擬和單元測試的Python文檔,但是我找不到任何這種行爲的解釋。
使用修飾器模式和與模式有什麼區別?在哪裏我可以找到更多關於這個?
只是爲了更清楚,這是我的代碼結構:
class TestClass(unittest.TestCase):
@staticmethod
def my_mock():
...mock
return service
# doesn't work
@mock.patch('mypackage.mymodule.my_method', side_effect=my_mock)
def test_something(self, my_method_mocked):
...test something
# work
def test_something(self):
with patch.object(mymodule, "my_method") as mocked_method:
mocked_method.side_effect = self.my_mock
...test something
這就是爲什麼我不能做TestClass.my_mock
。如果我這樣做,我會收到參考錯誤。
但是,當他們是'@ classmethod'時,我只能引用像這個Foo.my_mock這樣的方法。 '@ staticmethod'不起作用。 –
'Foo.my_mock'完全是*您如何訪問靜態方法。靜態方法和類方法之間的唯一區別是靜態方法不會將類的引用作爲參數。 – chepner
如果我嘗試像''Foo.my_mock''那樣使用'my_mock'作爲靜態方法,那麼我得到一個錯誤,說我無法做到這一點。但是我聲明'my_mock'是一個類方法,比我可以使用它。 –