当前位置: 首页 > 面试题库 >

python单元测试中的模拟常量不起作用

公孙联
2023-03-14
问题内容

我正在尝试在python单元测试中模拟常量。

我有一个名为 settings.py 的模块,其中包含一组常量,特别是我有一个:

REL_PATH = "my/path/{}/file.csv"

然后在另一个模块中,我有一个使用REL_PATH变量的函数,如下所示:

from path.for.REL_PATH.setting import REL_PATH

def create_csv(missing_path_here):
    columns = ["col_a", "col_b", ...]
    empty_df = pd.DataFrame(columns=columns)
    Writer(empty_df, REL_PATH.format(missing_path_here)).write_csv()

在我的单元测试中,我有以下代码:

class TestCreateAnomaliesRepositoryCsv(unittest.TestCase):

    @patch("path.for.setting.REL_PATH", "another/custom/path/file.csv")
    def test_create_anomalies_repository_csv(self):
         create_csv(missing_path_here="test")

我希望通过这种方式将在“另一个/自定义/路径/”路径下创建csv文件,但仍在原始目录中创建csv文件。

我也试图这样做:

def test_create_anomalies_repository_csv(self):
    with path("path.for.setting.REL_PATH", "another/custom/path/file.csv")
        create_csv(missing_path_here="test")

但最终结果是相同的。

我究竟做错了什么?


问题答案:

如果要修补对象,则必须始终修补模块中使用的对象,例如,如果您以以下形式导入对象:from x import y在模块中module,必须修补module.y而不是x.y。这是在描述文档,并且有一个很好的博客文章由斯内德尔德在详细描述问题。在您的情况下,您需要:

@patch("path.to.using_module.REL_PATH", "another/custom/path/file.csv")
def test_create_anomalies_repository_csv(self):
     create_csv(missing_path_here="test")

只要path.to.using_module.py输入这样的常量:

from path.for.setting import REL_PATH

您尝试过的另一个变体是等效的,也可以使用:

def test_create_anomalies_repository_csv(self):
    with path("path.to.using_module.REL_PATH", "another/custom/path/file.csv")
        create_csv(missing_path_here="test")

总而言之,您始终必须检查如何导入要使用的对象。基本上有两种情况:

  • 该对象是在进口sut.pyimport moduleimport module.object在这种情况下,它可以被修补为-module.object
  • 该对象的导入方式sut.py类似from module import object-在这种情况下,sut.py使用本地引用来引用该对象,并且应为sut.object


 类似资料:
  • 我有一个调用流api的异步函数。为这个函数编写单元测试的最佳方法是什么?必须模拟api响应。 我尝试使用aiounittest,并使用unittest的mock。但是这调用了实际的api,而不是得到模拟的响应。也尝试pytest.mark.asyncio注释,但这一直给我的错误-协程从未等待。我已经验证pyest-asyncio已经安装。 我正在使用VS代码和Python 3.6.6 以下是相关的

  • } 我正在努力解决这个问题。请帮帮我...谢谢。

  • 我面临一个问题,而嘲笑jUnit测试的东西。 情况如下: 类A实现了来自第三方jar的接口,并且需要实现method1。除了method1之外,A还包含method2,它是从method1调用的。method2本身调用一些外部服务。 我想单元测试方法1。 方法1接受输入,比如X。X有一个包裹在里面的输入变量,比如var1。var1由方法1中的逻辑使用,方法1在X中设置另一个变量,比如var2。 所

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient

  • 问题内容: 我已经通过两种方式为我的单元测试创​​建了用户: 1)为“ auth.user”创建一个大致如下的灯具: 我省去了看似不重要的部分。 2)在setUp函数中使用“ create_user”(尽管我宁愿将所有内容保留在我的Fixture类中): 请注意,两种情况下的密码均为辛普森。 我已验证该信息一次又一次正确地加载到测试数据库中。我可以使用User.objects.get来获取User

  • 我正在尝试使用Mockito在SprinBoot应用程序中进行一些jUnit测试。 现在我的服务有了一些变量,可以从通过注释: 我试图通过像这样使用来测试这个: 但是,该属性不会被填充,并保持为。 这方面有很多TPOIC,但我还没能拼凑出一个解决方案。我看到解决方案建议,但它似乎想做一个集成测试,使服务加速,但由于无法连接到数据库,服务失败了。所以这不是我想要的。 我还看到一些解决方案建议我制作一