如何使用flexmock模拟正在测试的模块中的类或对象



我想在我正在测试的周围函数的主体中模拟一个函数调用。我需要用flexmock来做这件事,或者至少知道这是否不可能。以下面的一段代码为例。我有3个文件。utils.py带有一个函数run_command,api.py带有一个类,该类有一个方法test_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构建的,所以我想遵循相同的模式。不幸的是,我找不到解决类似问题的测试。从python中使用flexmock的这个如此嘲讽的函数中,我想出了这个

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修复此问题?

我发现自己做错了什么。我从run_command的来源嘲笑它,而不是像对待@mock.patch那样使用它。为了修复它,我不得不像这个一样重写我的测试

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!!!"

相关内容

  • 没有找到相关文章

最新更新