簡體   English   中英

模擬python單元測試的問題

[英]Issue in mocking python unit test

我寫了一個測試如下:

class TestLoader(TestCase):

@pytest.fixture(autouse=True)
@patch('loaders.myloader.DSFactory')
def _initialize_(self, mock_ds_factory):
    self.loader = MyLoader()
    mock_ds = Mock()
    mock_ds_factory.get_ds_for_env.return_value = mock_ds
    self.loader.ds = mock_ds

def test_load(self):

    self.loader.ds.read_file.return_value = json.dumps(self.get_data())

    self.loader.load("test_s3_key") #####IN THIS LINE I AM GETTING ERROR AS MENTIONED BELOW##

@staticmethod
def get_data():
    return {"key1":"value1","key2":"value2"}

相關源代碼位於:loaders->myloader.py。 myloader.py 如下:

from common.ds_factory import DSFactory

class MyLoader:

   def __init__(self):

       self.ds = DSFactory.get_ds_for_env()


   def load(self, file_key):
       print(f"ds : {self.ds}")
       print(f"file read is : {self.ds.read_file(S3_BUCKET, file_key)}"}
       data_dict = json.loads(self.ds.read_file(S3_BUCKET, file_key))

但是在測試時,我收到如下錯誤:

ds is :<MagicMock name='DSFactory.get_ds_for_env()' id='140634163567528'>
file read is :<MagicMock name='DSFactory.get_ds_for_env().read_file()' id='140635257259568'>

E               TypeError: the JSON object must be str, bytes or bytearray, not 'MagicMock'

我不明白為什么,即使在模擬 read_file 的返回值之后

self.loader.ds.read_file.return_value = json.dumps(self.get_data())

我正在獲取MagickMock對象。 我被卡住了,不知道如何解決這個問題。

您的代碼: from common.ds_factory import DSFactory

class MyLoader:
   def __init__(self):
       self.ds = DSFactory.get_ds_for_env()
   def load(self, file_key):
       data_dict = json.loads(self.datastore.read_file(S3_BUCKET, file_key))
  1. 我在這里看到的問題是,數據存儲不存在,它應該是 self.ds.read_file
  2. 請打印 self.datastore.read_file(S3_BUCKET, file_key) 並驗證輸出。
  3. 這是來自 AWS_S3 存儲桶 Json 結構的錯誤。 它似乎不是以字符串格式而不是魔術模擬格式發送 Json 值。

有關 Magic Mock 格式的更多信息,請訪問: https : //medium.com/ryans-dev-notes/python-mock-and-magicmock-b3295c2cc7eb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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