我想在我正在测试的周围函数体中模拟一个函数调用。我需要用flexmock来做这件事,或者至少知道这是不可能的。以下面这段代码为例。我有3个文件。具有单个函数run_command
的utils.py和具有具有单个方法test_api.py的类的api.py。所有这些都是出于演示目的,并不是特别有用,但应该能够描述我的问题
# util.py
import subprocess
def run_command(cmd):
return subprocess.check_output(cmd)
现在api.py将使用来自util.py的run_command
# api.py
from util import run_comand
class Api:
def get_update(self):
result = run_command(["pwd"]).decode("utf-8")
return f"Update: {result}"
现在,我想为Api.get_update编写一个测试,但并不想实际执行run_command
使用mock模块,我可以像这样编写测试
# test_api.py
from unittest import mock
@mock.patch("api.run_command")
def test_get_update(run_command_mock):
run_command_mock.return_value = b"sucess!!!"
api = Api()
result = api.get_update()
assert result == "Update: success!!!"
上述测试的效果与预期一致。当get_update
被调用时,它实际上并不执行run_command
。它使用的是模拟版本。现在我想用flexmock来做这件事。不过,我不知道这是否可能。只是我正在为一个项目做贡献,所有的测试都是用flexmock构建的,所以我想遵循同样的模式。不幸的是,我找不到一个能解决类似问题的测试。从这个SO mocking-functions-with-flexmock-in-python,我想到了这个
import utils as utils_module
import flexmock
from api import Api
def test_get_update():
flexmock(utils_module).should_receive("run_command").with_args(["pwd"]).once().and_return("success!!")
api = Api()
result = api.get_update()
assert result == "Update: success!!!"
上述测试失败。utils中的run_command
仍然会执行,而不是我的模拟版本。如何使用flexmock修复此问题?
发布于 2020-04-05 09:50:47
我发现我做错了什么。我是从它的来源而不是像我在@mock.patch
中使用它的地方嘲笑run_command
的。为了修复它,我不得不像这样重写我的测试
import flexmock import flexmock
import api as api_module # Instead of importing utils, I'm importing api since that's where run_command is called even though it's coming from utils
def test_get_update():
flexmock(api_module).should_receive("run_command").once().and_return(b"success!!!")
api = api_module.Api()
result = api.get_update()
assert result == "Update: success!!!"
https://stackoverflow.com/questions/61030024
复制相似问题