[英]How to mock class instance in unit test of this class instance method
我試圖對some_function
,這是需要someapi.api
實例的MyClass
實例方法。 如何使用一些返回值修補self.api.something1.something2(foo)
?
import someapi
class MyClass(object):
def __init__(self,a,b):
self.a = a
self.b = b
self.api = someapi.api(self.a, self.b)
def some_function(self, foo):
result = self.api.something1.something2(foo)
new_result = dosomething(result)
return new_result
因此,我真正想要的是模擬此api的響應,以便我可以測試dosomething(result)
是否滿足我的要求。
@mock.patch('self.api.something1.something2', side_effect='something')
def testGet_circuits(self,pymock):
result = some_function('foobar')
expected_result= 'something'
self.assertEqual(result, 'expected_result')
我試過了
@mock.patch('someapi.api')
def testSome_function(self,someapi_mock):
api = MyClass('a','b')
result = api.some_function('foo')
self.assertEqual(result,'newfoo')
我正在努力的是如何在some_function中模擬self.api.something1.something2(foo)
:(
您沒有正確設置模擬。 我使用您的代碼編寫了一個示例,並設法將一個有效的測試方法組合在一起。 最終,這里發生的是您沒有告訴模擬程序在代碼運行時如何表現。 您可能在正確的地方開始了模擬,但除此之外,模擬本身不再具有要允許代碼運行而試圖訪問的任何屬性。 我將遍歷代碼以幫助說明:
class TestStuff(unittest.TestCase):
@mock.patch('real_code.someapi.api', autospec=True)
def testSome_function(self, someapi_mock):
someapi_mock.return_value.something1 = mock.Mock(spec=Something)
someapi_mock.return_value.something1.something2.return_value = 'newfoo'
api = MyClass('a', 'b')
result = api.some_function('foo')
self.assertEqual(result, 'newfoo')
首先,請注意,關於測試位置,我有更多的嘲笑,請記住這一點,您應該在此處閱讀有關內容。
對於模擬配置問題,我只能從您的真實代碼中假設api.something1.something2
指示something1
持有某個其他類的實例,該類使您可以訪問something2
方法。 因此,在此假設下說明了該示例。
現在,正如您在方法的第一行中看到的那樣,我正在做的就是告訴我的模擬確保它具有something1
屬性。 重要的是要記住,在進行模擬時,甚至當您設置規范和/或自動規范時 (如我在示例中所使用的),您都無法訪問在__init__
創建的屬性。 因此,根據我的示例,您需要在模擬中提供它們。
現在第二行進行下一步,以模擬您要從中獲取結果的something2
方法行為。 完成此操作后,在調用您的真實代碼時,它應該經歷您設置的預期行為並返回預期的newfoo
值。
為了進一步提供幫助,以下是我用來幫助進行功能測試的確切代碼:
import someapi
class MyClass(object):
def __init__(self,a,b):
self.a = a
self.b = b
self.api = someapi.api(self.a, self.b)
def some_function(self, foo):
result = self.api.something1.something2(foo)
new_result = dosomething(result)
return new_result
def dosomething(foo):
return foo
class api:
def __init__(self, a, b):
self.a = a
self.b = b
self.something1 = Something()
class Something:
def something2(self, some_arg):
return some_arg
感謝所有的答案,這些答案肯定幫了我的忙。 這整個模擬物看起來像兔子洞,我需要更深入地全面理解。
@mock.patch('someapi.api')
def testSome_function(self,someapi_mock):
someapi_mock = return_value.something1.something2.return_value = 'mocked_value'
api = MyClass('a','b')
result = api.some_function('foo')
self.assertEqual(result,'newfoo')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.