我正在try 使用pytest为我的python项目编写单元测试.我有一个来自另一个repo的模块,名为SQL_SERVICES.在SQL_SERVICES中,有一个我试图模拟的名为READ_SQL的函数.

到目前为止,如果我像这样导入模块,我只能模拟该函数

import sql_services

并调用sql_services.read_sql,但如果导入以下函数,

from sql_services import read_sql

这是一个问题,因为我的代码库使用后一种方法来导入函数

下面是我try 编写的单元测试的函数:

from sql_services import read_sql

def foo():
    df = read_sql("SELECT * FROM schema.table")
    return df

以下是我到目前为止拥有的单元测试文件:

import pytest
import unittest.mock as mock
import pandas as pd

import sql_services

from entry import foo

@mock.patch("sql_services.read_sql")
def test_read_sql(mock_read_sql):
    mock_read_sql.return_value = pd.DataFrame()
    df = sql_services.read_sql("SELECT * FROM schema.table")
    assert df.empty

@mock.patch("sql_services.read_sql")
def test_do_a_read(mock_read_sql):
    mock_read_sql.return_value = pd.DataFrame()
    df = foo()

    assert df.empty

第一个测试通过,第二个测试失败,因为它实际上从数据库中读取数据帧.有没有什么方法可以在不重构整个代码库的情况下从foo中模拟该函数?

推荐答案

你只需补上正确的name:

@mock.patch("entry.read_sql")
def test_read_sql(mock_read_sql):
    mock_read_sql.return_value = pd.DataFrame()
    df = sql_services.read_sql("SELECT * FROM schema.table")
    assert df.empty]

entry.foo使用的是全局变量entry.read_sql来访问你想要模拟的函数,而不是全局变量sql_servies.read_sql.

Python相关问答推荐

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

Python在tuple上操作不会通过整个单词匹配

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

如何让程序打印新段落上的每一行?

NP.round解算数据后NP.unique

对所有子图应用相同的轴格式

如何将多进程池声明为变量并将其导入到另一个Python文件

Pre—Commit MyPy无法禁用非错误消息

Pandas Loc Select 到NaN和值列表

不能使用Gekko方程'

如何指定列数据类型

使用特定值作为引用替换数据框行上的值

try 检索blob名称列表时出现错误填充错误""

基于行条件计算(pandas)

应用指定的规则构建数组

SpaCy:Regex模式在基于规则的匹配器中不起作用

一维不匹配两个数组上的广义ufunc

我如何处理超类和子类的情况