【发布时间】:2021-06-10 02:41:04
【问题描述】:
Python 3.7。我正在尝试对以下功能进行单元测试:
def is_json_clean():
# function for is_json_clean here, returns bool
def json_function(blob, raw_bucket, lake_bucket):
data_string = blob.download_as_bytes()
data = json.loads(data_string)
if is_json_clean(data) is True:
raw_bucket.copy_blob(blob, lake_bucket)
我对模拟补丁还很陌生,可以在这里举个例子!我如何使用 mock.patch 或类似的东西来获取带有 is_json_clean() 函数的 if 语句来返回 True 以便我可以断言调用了 copy_blob 函数?我想我可以制作一个像这样的补丁:
@mock.patch.object(imported_module, "is_json_clean", return_value=True)
def test_json_function(mock):
# rest of the test function
# including assert statement for the copy_blob function
但是我如何将它插入到我的测试中以断言我的 copy_blob 函数?我知道有很多与单元测试相关的问题,但我还没有找到我的问题的确切答案(就像我说的,我很新)。任何帮助表示赞赏。谢谢!
【问题讨论】:
-
需要在测试方法中添加上述装饰器补丁,可以参考mock-patch-object-to-change-the-return-value-of-a-method-called中的示例。
-
@KrishnaChaurasia 好的,更正:我确实将此补丁添加到了测试方法中!应该澄清一下。我现在要问的是,我将如何在测试函数本身中引用该补丁以强制 if 语句为 TRUE,然后调用 copy_blob()。
-
你不需要做任何事情,只需调用要测试的方法,在测试路径中,mocked方法将替换原来的实现。您可以在
if路径中的原始方法中添加print()语句,并且在执行测试时应该会看到相同的内容。 -
我明白了!你说的有道理!那么,当我运行测试时,是否有任何理由不会调用函数 copy_blob ?这是我当前的问题。
-
我不确定那里发生了什么,您可以在
if路径中添加print()以查看补丁是否按预期工作,然后使用调试器深入挖掘。
标签: python python-3.x unit-testing mocking