python - 模拟在类变量初始化期间作为参数传入的函数

标签 python unit-testing mocking python-unittest

scuevals_api/resources/students.py :

def year_in_range(year):
    return datetime.now().year <= year <= datetime.now().year + 10


class StudentsResource(Resource):
    args = {
        'graduation_year': fields.Int(required=True, validate=year_in_range),
    }

    ...

我正在尝试模拟 year_in_range (始终返回 True),但是到目前为止,我的所有尝试都失败了。

我正在使用 mock.patch 的装饰器方法,并尝试了大量不同的目标,但我认为正确的目标应该是: @mock.patch('scuevals_api.resources.students.year_in_range', return_value=True)

模拟函数永远不会被调用,因为它没有正确模拟。我也没有收到任何错误。

我唯一剩下的怀疑是,它与该函数作为参数传递给 fields.Int 有关(因此是问题标题),但在我看来,它应该'不会影响任何事情。

我不知道应该在哪里模拟这个函数?

最佳答案

mock修补year_in_range时已经太晚了。 mock.patch 导入由您提供的字符串指定的模块,并修补模块中指示的名称,以便它引用模拟对象 - 它不会从根本上改变函数对象本身。导入 scuevals_api.resources.students 时,StudentsResource 类的主体将被执行,并且对原始 year_in_range 的引用保存在 >StudentResource.args['graduation_year'] 对象,因此使名称 year_in_range 引用模拟对象没有影响。

在这种特殊情况下,您有几个选择:

  1. 假设您正在尝试测试某些功能,而不是尝试模拟 year_in_range,您可以使用测试条件的数据播种数据库(?)
  2. 您可以修补datetime.now,它将由year_in_range调用
  3. 您可以修补 StudentResource.args['graduation_year'] 的成员,其中保存了传递给 validate 的函数。

关于python - 模拟在类变量初始化期间作为参数传入的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54282858/

相关文章:

python - 字符串替换可以写在列表理解中吗?

c++ - 访问实现接口(interface)但不属于接口(interface)的类的函数

java - Scala/Gradle项目…哪里存储单元测试所需的超大文件?

PHPUnit willReturnMap 方法 - 回调参数

python - 为什么 python 2.6 不更新我的 numpy 数组?

python - 在 python 中的不规则网格上覆盖 map 的等高线

python - 在python中的2D中的其他点集的凸包中找到部分或完全包含一组点

java - 如何使用 Mockito 在另一个 Mock 类中模拟 Spring 消息资源?

node.js - 用 Jest 方式模拟 Node 获取,创建一个用于模拟的响应对象

c# - 如何模拟多个查询字符串?