2009-08-20 11 views
7

¿Puede alguien explicarme cómo probar correctamente los errores de Postgres DB, particularmente IntegrityError? Por ejemplo, he siguiente prueba:django Postgres IntegrityError

class TestSlugs(TestCase): 
    # This slug must be unique 
    b = BookPublisher(slug=self.duplicate_slug) 
    self.assertRaises(IntegrityError, b.save) 

    #check if there's only one BookPublisher 
    self.assertEquals(BookPublisher.objects.count(), 1) 

Aquí llama la IntegrityError pero entonces todas las operaciones se producirá un error, porque así es como postgres obras, bien. Veo en los documentos que puedo usar transaction.rollback() pero donde: en la prueba o en el método save()?

Además, no me gusta la idea de escribir retrocesos a mano, ¿por qué no puede django solo tratar de guardar, y si falla? Dame IntegrityError y déjame continuar trabajando.

estoy usando Django 1.1

Respuesta

2

No altere el método save(), ya que desea que se propagarse a través de operaciones normales. Debería detectar la excepción en su clase de prueba y deshacerla (tenga en cuenta que, dado que está probando transacciones, debe crear una TransactionalTestCase en lugar de la TestCase normal).

+0

Ok, gracias. Entonces, en el código de Live, todo estará bien después de capturar IntegrityError? ¿O debería todavía revertir allí explícitamente? –

+0

Debe evitar causar siempre IntegrityError en su propio código y tratar cualquier error de SQL como un error. Por lo tanto, debe verificar antes de intentar alguna modificación si esa modificación será sensata. Si encuentra que la modificación no se puede realizar, puede deshacer e informar el problema al usuario. O puede decidir omitir la modificación, o hacer una modificación diferente en su lugar. –

2

no es 100% seguro de que esto es válido, pero se puede hacer:

def save(self): 
    transaction.commit() 
    try: 
     super(MyModel, self).save() 
    except IntegrityError: 
     transaction.rollback() 
    else: 
     transaction.commit() 
+0

gracias, intentaré eso. Pero francamente hablando, esto es feo :) –

Cuestiones relacionadas