因此,在敲打键盘几个小时后,我找到了解决方案。问题似乎是以下原因(如果有人知道的更好,请纠正我)。
当我运行时mock.create_autospec(User)
,模拟模块尝试检查的所有属性,User以为其将吐出的Mock对象创建适当的规格。发生这种情况时,它会尝试检查属性User.query,只有在Flask应用程序范围内时才能评估该属性。
发生这种情况是因为在User.query
评估时,创建了一个需要有效会话的对象。该会话由Flask-sqlAlchemy内部类create_scope_session
上的方法创建sqlAlchemy。
该方法实例化一个称为SignallingSession
其__init__
方法的类sqlAlchemy.get_app
。RuntimeError
当数据库中没有注册任何应用程序时,此方法将引发。
通过修补SignallingSession方法,一切正常。由于我不想与数据库进行交互,所以可以:
import unittest
import datetime
import mock
from actions import age
@mock.patch("flask_sqlalchemy.SignallingSession", autospec=True)
class TestModels(unittest.TestCase):
def test_age(self, session):
import database
user = mock.create_autospec(database.User)
user.birthday = datetime.date(year=1987, month=12, day=1)
print age(user)