2017-03-03 103 views
5

on_commit fonksiyonu mevcut işlem işlenen sonra bir işlem (örneğin, bir kereviz görev) tetiklemek için mümkün Django'ya 1.9 eklenmiştir. Bu işleve dayanan özellikleri sınamak için TransactionTestCase kullanması gerektiğini daha sonra in the docs'dan bahsetmişlerdir. Bununla birlikte, TestCase'dan farklı olarak (işlemleri kullanan ve geri döndüren), TransactionTestCase her bir testten sonra tüm veritabanını boşaltır.Veritabanını temizlemeden Django on_commit kancası nasıl test edilir?

Ne yazık ki, ilk test veritabanını temizler sonra müteakip testler artık işe yaramamaktadır demektir veritabanı, içindeki bazı yararlı veriler önceden yüklemek veri taşıma işleminiz var. Daha iyi bir yol

with mock.patch.object(django.db.transaction, 'on_commit', lambda t: t()): 
    test_something() 

var mı:

Ben on_commit alay ile kirli bir hile başvurmadan sona erdi?

+3

Aslında senin geçici çözüm o kadar da kötü değil: bu makaleye göz atın . Ve ben 'TransactionTestCase' kullanmak istemiyorum çünkü benim usecase için yavaş (büyük 'setUp's ve birçok fikstür.) – Palasaty

cevap

0

aklımda iki ihtimal vardır: bölüm post_migrate floş sonra yayılan diyor

  1. this olarak, yani
  2. Sen TransactionTestCase alt sınıf ve sizin _fixture_teardown (bunu görebilirsiniz uygulayabilir bazı yararlı veriler önceden yükleme gerçekleştirebilirsiniz Bu yöntemin en sonunda flush denir).

Göçünüz çok pahalı değilse ve ikincisiyse, muhtemelen birincisi ile giderim.

+0

' post_migrate 'sinyalini kullanmak iyi bir fikir. Veri geçişlerimizi buna dönüştürüp dönüştüremeyeceğimi göreceğim çünkü genel olarak daha temiz görünüyor! –