2013-04-01 3 views
1

Моя 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()) 

Это должно произойти сбой при попытке вставить новую категорию с тем же name и parent из-за UniqueConstraint в базе данных, но это не

Кроме того, когда я утверждаю, в последней строке (опущено в коде выше), сколько записей у меня есть в таблице

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

Он терпит неудачу

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

Это означает, что он перезаписывает существующую запись?

Что здесь общего не работает?

UPDATE

В соответствии с @ sr2222 ответа, я решил ошибку в моем следующем методе

def session_commit(self): 
    # noinspection PyBroadException 
    try: 
     db.session.commit() 
    except: 
     db.session.rollback() 
     raise # added error to propagate up 
    finally: 
     pass 

ответ

1

Ваш session_commit функция имеет всеохватывающий except блок вокруг БД фиксации. Если отката не удалась, это всегда будет проходить. Что касается вашего утверждения, ваша фиксация будет терпеть неудачу, так как вы подавите ошибку, поэтому единственная строка, которую вы найдете, должна быть оригинальной неотредактированной записью. Если вы хотите условно обрабатывать состояние исключения в своей проверке, вам нужно поймать его и обработать соответствующим образом, а не просто выбросить.

+0

Отличный ответ! это наверняка ошибка, я ее исправил – daydreamer

Смежные вопросы