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
引用模拟对象没有影响。
在这种特殊情况下,您有几个选择:
- 假设您正在尝试测试某些功能,而不是尝试模拟
year_in_range
,您可以使用测试条件的数据播种数据库(?) - 您可以修补
datetime.now
,它将由year_in_range
调用 - 您可以修补
StudentResource.args['graduation_year']
的成员,其中保存了传递给validate
的函数。
关于python - 模拟在类变量初始化期间作为参数传入的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54282858/