3

unique=Trueblank=Falseなどの制約を持ついくつかのモデルを書いていますnull=False。鼻のあるモデルのテストを書こうとしています。ただし、次のようなテストを書くと:

from job_sites.models import Site, SiteType

@raises(IntegrityError)
def test_empty_site():
   s = Site()
   s.save()

@raises(IntegrityError)
def test_empty_site_type():
   st = SiteType()
   st.save()

DatabaseError: current transaction is aborted, commands ignored until end of transaction block最初のテストを実行した後、次のような DatabaseError が発生し ます。

エラーが予想される場合に DJango モデル テストを実行する正しい方法は何ですか?

参考までに、モデルは次のようになります。

class SiteType(models.Model):
    site_type_id = models.AutoField(primary_key=True)
    site_type = models.CharField(max_length=32, unique=True, blank=False, null=False, default=None)
    site_type_abbrev = models.CharField(max_length=32, blank=True)

    class Meta:
        db_table = u'site_types'

class Site(models.Model):
    site_id = models.AutoField(primary_key=True, blank=False, null=False, db_index=True)
    site_name = models.CharField(max_length=128, blank=False, null=False, db_index=True)
    site_type = models.ForeignKey(SiteType, blank=True, null=True)
    date_entered = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = u'sites'

私の制約とデフォルトは次のようになります。

ALTER TABLE site_types ADD CONSTRAINT site_types_site_type_name_minlen CHECK (char_length(site_type) > 0);
ALTER TABLE sites ALTER COLUMN date_entered SET DEFAULT now();
ALTER TABLE sites ADD CONSTRAINT sites_site_name_minlen CHECK (char_length(site_name) > 0);
4

1 に答える 1

2

鼻の簡潔なテスト定義を使用する代わりに、テストを Django の TestCase のサブクラスとして作成する必要があります。そうすれば、データベースなどが実行時にセットアップおよび構成され、すべてのトランザクションが魔法のように処理されます。

Django プロジェクトのテストの書き方の概要は、https ://docs.djangoproject.com/en/dev/topics/testing/overview/ にあります。

あなたがやろうとしていることと同等のものは次のようになります:

from django.db import IntegrityError
from django.utils import unittest
from job_sites.models import Site, SiteType

class TestMyStuff(unittest.TestCase):

    def test_empty_site(self):
        s = Site()
        assertRaises(IntegrityError, s.save())

    def test_empty_site_type(self):
        st = SiteType()
        assertRaises(IntegrityError, st.save())

(免責事項: 私は実際にこのコードを実行していないので、動作しない可能性があります。)

ただし、この種のことをテストするのはおそらく時間の無駄です。ここでテストされている唯一のロジックは Django の内部的なものであるため、アプリケーションをテストすることによってアプリケーションについて何も学べません。

于 2013-01-12T05:53:07.727 に答える