【问题标题】:InvalidRequestError: Instance '<User at 0x7f65938a7510>' is not persistedInvalidRequestError:实例 '<User at 0x7f65938a7510>' 未持久化
【发布时间】:2014-10-27 22:13:35
【问题描述】:

我想在框架Flask中进行这样的测试并得到消息:

InvalidRequestError: Instance '<User at 0x7f65938a7510>' is not persisted

  File "tests.py", line 31, in test_removeProfil
    db.session.delete(user)

我的测试代码:

class TestCase(unittest.TestCase):

    def test_removeProfil(self):
        user = User(name="John", age=33, email="john@john.com")
        db.session.delete(user)
        db.session.commit()
        self.assertNotEqual(user.name, "John")
        self.assertNotEqual(user.age, 33)
        self.assertNotEqual(user.email, "john@john.com")

【问题讨论】:

    标签: python unit-testing flask


    【解决方案1】:

    您正在尝试删除一个新实例,而不是您从数据库中获取的一个实例。要么你打算使用db.session.add(),要么你打算使用user = User.query.filter_by(email='john@john.com').first()(或类似的东西)并删除它。

    您可能还无法访问已删除实例的属性(假设您已按上述正确删除它)。当您提交会话时,该会话中的所有实例都将过期。尝试访问过期属性会触发数据库查找,但无法查找此对象,因为它已被删除。

    您可以关闭expire_on_commit,但这不是正常行为,可能会给您带来其他问题。

    您也可以尝试拨打make_transient

    最终,您真的应该放弃已删除的实例。可能有更好的方法来完成您想要完成的任何事情。

    【讨论】:

      【解决方案2】:

      当你打电话时

      user = User(name="John", age=33, email="john@john.com")
      

      您创建的是 python 对象,而不是 db 中的对象。所以你需要先将它添加到 db

      db.session.add(user)
      db.session.commit()
      

      之后你可以从数据库中删除它

      db.session.delete(user)
      db.session.commit()
      

      而你的assertNotEqual 毫无意义。您应该测试删除之前和之后从数据库中选择的结果是不同的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-01
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 2015-07-20
        相关资源
        最近更新 更多