python,测试两次插入同一行时没有失败

时间:2013-04-01 13:17:34

标签: python unit-testing sqlalchemy

我的PostgreSQL表格似乎是

             Table "public.categories"
   Column   |           Type           | Modifiers
------------+--------------------------+-----------
 uuid       | uuid                     | not null
 name       | character varying        | not null
 parent     | character varying        | not null
 created_on | timestamp with time zone | not null
Indexes:
    "categories_pkey" PRIMARY KEY, btree (uuid)
    "categories_name_parent_key" UNIQUE CONSTRAINT, btree (name, parent)
Referenced by:
    TABLE "transactions" CONSTRAINT "transactions_category_id_fkey" FOREIGN KEY (category_id) REFERENCES categories(uuid)

拥有unique(name, parent)。 我的Test

  def setUp(self):
        db.create_all()

    def session_commit(self):
        # noinspection PyBroadException
        try:
            db.session.commit()
        except:
            db.session.rollback()
        finally:
            pass
   def test_insert_same_category_twice(self):
        """
         category, parent relationship is unique
        """
        db.session.add(Category('test_insert_same_category_twice', 'parent1'))
        self.session_commit()
        self.assertEquals(1, len(db.session.query(Category).all()))
        db.session.add(Category('test_insert_same_category_twice', 'parent1')) # should fail
        self.session_commit()

    def tearDown(self):
        db.session.close()
        for tbl in reversed(db.metadata.sorted_tables):
            db.engine.execute(tbl.delete())

当我尝试在数据库中插入具有nameparent的新类别时,它会失败,但它不会

另外,当我在最后一行断言时(在上面的代码中省略)我在表中有多少条目

UniqueConstraint

失败

self.assertEquals(2, len(db.session.query(Category).all()))

这意味着它会覆盖现有的条目吗?

这里出了什么问题?

更新

根据@ sr2222的回答,我在以下方法中解决了这个错误

    self.assertEquals(2, len(db.session.query(Category).all()))
AssertionError: 2 != 1

1 个答案:

答案 0 :(得分:1)

您的session_commit函数在数据库提交周围有一个cat except块。除非回滚失败,否则将始终通过。至于你的断言,你的提交是静默失败的,因为你正在压制错误,所以你找到的单行应该是未经编辑的原始条目。如果你想在验证中有条件地处理异常状态,你需要捕获它并适当地处理它,而不是把它扔掉。