我正在尝试测试一种需要json.load
在 Python 3.6 中使用的方法。经过几次尝试,我尝试“正常”运行测试(使用 CLI 中的通常 unittest.main() ),并在 iPython REPL 中运行。
具有以下功能(为了示例的目的而简化)
def load_metadata(name):
with open("{}.json".format(name)) as fh:
return json.load(fh)
通过以下测试:
class test_loading_metadata(unittest2.TestCase):
@patch('builtins.open', new_callable=mock_open(read_data='{"disabled":True}'))
def test_load_metadata_with_disabled(self, filemock):
result = load_metadata("john")
self.assertEqual(result,{"disabled":True})
filemock.assert_called_with("john.json")
测试文件的执行结果令人心碎:
TypeError: the JSON object must be str, bytes or bytearray, not 'MagicMock'
在命令行中执行相同的操作时,会给出成功的结果。
我尝试了几种方法(使用with
, 作为装饰器进行修补),但我唯一能想到的就是unittest
库本身,以及它可能会做什么来干扰模拟和修补。
还检查了 virtualenv 和 ipython 中的 python 版本,即json
库的版本。
我想知道为什么看起来相同的代码在一个地方工作而在另一个地方不起作用。或者至少是一个指向正确方向的指针,以了解为什么会发生这种情况。