为什么单元测试代码中对item对象没有db.session.add(),而是直接提交?


#1

Todoism项目中单元测试的代码,只对user对象进行了add()操作,item却没有。
同样在后面的代码中item都没有add()操作,请问是什么?
位置:test_api.py

    def setUp(self):
        app = create_app('testing')
        self.app_context = app.test_request_context()
        self.app_context.push()
        db.create_all()
        self.client = app.test_client()

        user = User(username='grey')
        user.set_password('123')
        item = Item(body='Test Item11111', author=user)

        user2 = User(username='li')
        user2.set_password('456')
        item2 = Item(body='Test Item 2222222', author=user2)

        db.session.add(user)
        db.session.add(user2)
        db.session.commit()
   def test_get_items(self):
        user = User.query.get(1)
        item2 = Item(body='Test Item 2', author=user)
        item3 = Item(body='Test Item 3', author=user)
        item4 = Item(body='Test Item 4', author=user, done=True)
        db.session.commit()

#2

根据我经验和猜测

item = Item(body='Test Item11111', author=user)

等价于

Item(body='Test Item11111')
user.items.append(item)

即:

    def setUp(self):
        app = create_app('testing')
        self.app_context = app.test_request_context()
        self.app_context.push()
        db.create_all()
        self.client = app.test_client()

        user = User(username='grey')
        user.set_password('123')
        #item = Item(body='Test Item11111', author=user)
        # 等价于
        item = Item(body='Test Item11111')
        user.items.append(item)

        user2 = User(username='li')
        user2.set_password('456')
        #item2 = Item(body='Test Item 2222222', author=user2)
        # 等价于
        item2 = Item(body='Test Item 2222222')
        user2.items.append(item2)

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

另外,这个应该和书本「5.7.1 级联操作」小节的知识点有关。


#3

谢谢!好像我问了一个傻问题哈哈


#4

你是不是把第 5 章跳过了:sweat_smile:?因为书没在手边,就从书稿里复制了一份对应章节的内容,如下:

5.7.1 级联操作

save-update

save-update是默认的级联行为,当cascade参数设为save-update时,如果使用db.session.add()方法将Post对象添加到数据库会话时,那么与Post相关联的Comment对象也将被添加到数据库会话。我们首先创建一个Post对象和两个Comment对象:

>>> post1 = Post()
>>> comment1 =Comment()
>>> comment2 =Comment()

将post1添加到数据库会话后,只有post1在数据库会话中:

>>> db.session.add(post1)
>>> post1 in db.session
True
>>> comment1 in db.session
False
>>> comment2 in db.session
False

如果我们让post1与这两个Comment对象建立关系,那么这两个Comment对象也会自动被添加到数据库会话中:

>>> post1.comments.append(comment1)
>>> post1.comments.append(comment2)
>>> comment1 in db.session
True
>>> comment2 in db.session
True

当调用db.session.commit()提交数据库会话时,这三个对象都会被提交到数据库中。


#5

谢谢!
因为这部分理解起来比较简单,看的比较快,等到后面就给忘了:rofl::rofl::rofl:
要多复习复习!