栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

类方法中使用的模拟open()函数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

类方法中使用的模拟open()函数

TL; DR

问题的核心在于,您还 应该 嘲笑

json.dump
能够正确测试将要写入文件的数据。在对您的测试方法进行一些重要调整之前,我实际上很难运行您的代码。

  • 模拟与
    builtins.open
    mymmodule.open
  • 您在上下文管理器中,因此应检查
    m.return_value.__enter__.write
    ,但是实际上是从json.dump调用写入操作,而在该位置将调用写入操作。(下面有关建议的解决方案的详细信息)
  • 您还应该模拟
    json.dump
    以简单地验证它是否与您的数据一起调用

简而言之,鉴于上述问题,该方法可以重写为:

有关以下所有详细信息

def test_save_data_to_file(self):    with patch('builtins.open', new_callable=mock_open()) as m:        with patch('json.dump') as m_json: self.mc.save_data_to_file(self.data) # simple assertion that your open was called  m.assert_called_with('/tmp/data.json', 'w') # assert that you called m_json with your data m_json.assert_called_with(self.data, m.return_value)

详细说明

为了专注于我在代码中看到的问题,我强烈建议做的第一件事,因为

open
它是内置函数,是从内置函数模拟的,此外,您可以使用
new_callable
和来节省一行代码
as
,因此您可以简单地做这个:

with patch('builtins.open', new_callable=mock_open()) as m:

我遇到的下一个问题是我的代码无法运行,直到您开始循环调用时才进行了以下调整:

m.return_value.__enter__.return_value.write.mock_calls

要对此进行剖析,必须牢记的是您的方法正在使用上下文管理器。使用上下文管理器时,您的写操作实际上将在

__enter__
方法内部完成。因此,
return_value
您要从中
m
获得的return_value
__enter__

但是,这将我们带到您要测试的问题的核心。由于

json.dump
写入文件时的工作方式,您
mock_calls
在检查代码后进行的写入实际上将如下所示:

<MagicMock name='open().write' id='4348414496'>call('[')call('{')call('"name"')call(': ')call('"peter"')call(', ')call('"id"')call(': ')call('5414470')call('}')call(', ')call('{')call('"name"')call(': ')call('"tom"')call(', ')call('"id"')call(': ')call('5414472')call('}')call(', ')call('{')call('"name"')call(': ')call('"pit"')call(', ')call('"id"')call(': ')call('5414232')call('}')call(']')call.__str__()

测试将不会很有趣。因此,这为我们提供了您可以尝试的下一个解决方案;模拟

json.dump

您不应该测试json.dump,应该测试使用正确的参数调用它。话虽如此,您可以按照类似的方式进行嘲笑并执行以下操作:

with patch('json.dump') as m_json:

现在,有了它,您可以大大简化测试代码,以简单地验证是否使用您要测试的数据调用该方法。因此,当您将它们放在一起时,将具有以下内容:

def test_save_data_to_file(self):    with patch('builtins.open', new_callable=mock_open()) as m:        with patch('json.dump') as m_json: self.mc.save_data_to_file(self.data) # simple assertion that your open was called  m.assert_called_with('/tmp/data.json', 'w') # assert that you called m_json with your data m_json.assert_called_with(self.data, m.return_value.__enter__.return_value)

如果您有兴趣进一步重构以使您的测试方法更简洁,那么您也可以将修补程序设置为装饰器,将代码更简洁地保留在方法中:

@patch('json.dump')@patch('builtins.open', new_callable=mock_open())def test_save_data_to_file(self, m, m_json):    self.mc.save_data_to_file(self.data)    # simple assertion that your open was called    m.assert_called_with('/tmp/data.json', 'w')    # assert that you called m_json with your data    m_json.assert_called_with(self.data, m.return_value.__enter__.return_value)

检查是您最好的朋友,以查看在什么步骤调用了什么方法,以进一步帮助测试。祝好运。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号