簡體   English   中英

如何在該類實例方法的單元測試中模擬類實例

[英]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值。

為了進一步提供幫助,以下是我用來幫助進行功能測試的確切代碼:

real_code.py

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

someapi.py

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM