InvalidRequestError:Instance&#39; <user at =“”0x7f65938a7510 =“”>&#39;没有持久</user>

时间:2014-10-27 22:13:35

标签: python unit-testing flask

我想在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")

2 个答案:

答案 0 :(得分:4)

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

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

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

您也可以尝试在其上调用make_transient

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

答案 1 :(得分:1)

致电时

| Student Name | Courses    |
|:-------------|-----------:|
| John         | C1, C2, C3 |
| Marc         | CA, CB, CC |

您创建python对象,而不是db中的对象。因此,您需要先将其添加到db

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

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

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

和您的db.session.delete(user) db.session.commit() 没有任何意义。您应该测试删除前后数据库选择的结果是否不同