2011-08-11 1 views
1

私はDjangoを効果的に表示するために(現在)使用しているレガシーアプリケーションを持っています。私の作業テストのサンプルがこのように見えます。Djangoのテスト - データを外部から変更する際の複数のクエリ。キャッシュの問題?

def test_add_property_value(self): 
    """Test set/get a value""" 
    # This will do some external process which occcurs to the db. 
    pm = Pm(mysql_db='test_bugs') 
    tree = pm.add_release_tree() 
    prop_type, pmvalue = ("string", "Funny Business") 
    pmproperty = "%s_%s_basic" % (tree[0].name, prop_type) 
    pm.add_property_definition(pmproperty, prop_type=prop_type) 
    pm.add_propval(pmproperty, value=pmvalue, project=tree[0].name) 

    # Now use Django to pull the value back out.. 
    project = Project.objects.get(name=tree[0].name) 
    property = project.get_property(pmproperty) # Custom query using sql.raw 
    self.assertEqual(pmvalue, property.value) 

ご覧のとおり、基本的なA/Bテストです。今、私は限界を見つけました、そして、私は周りに回っているように見えません。複数の外部の追加チェックループのクエリが失敗していますと表示されているため、上記のコードを変更すると失敗します。に実行してもに実行されません。

​​

私はCACHE_BACKENDについて読んだが、それは助けていないようでした。他のアイデアは?さらなる調査の後、これは私の外部データベースには全く関係していないようです。 Arghh ..それは月曜日のように感じる!

  1. これはキャッシュの問題ですか?BTW - Setting CACHE_BACKEND = 'dummy:///'または 'locmem:///'は何もしませんでした。
  2. この問題の診断方法を教えてください。 2つの小さなひねりが... DanielSeverioに基づいて -

おかげ

アップデートはここで最終的な答えでした。非常にポインタを感謝!

class PropertyTests(TransactionTestCase): #CHANGE1 
    def test_add_property_value(self): 
     """Test set/get a value""" 

     import logging 
     l = logging.getLogger('django.db.backends') 
     l.setLevel(logging.DEBUG) 
     l.addHandler(logging.StreamHandler()) 

     # This will do some external process which occcurs to the db. 
     pm = Pm(mysql_db='test_bugs', p4_port = settings.ICMSERVER_TEST_PORT) 
     tree = pm.add_release_tree() 
     prop_type, pmvalue = ("string", "Funny Business") 
     pmproperty = "%s_%s_basic" % (tree[1].name, prop_type) 
     pm.add_property_definition(pmproperty, prop_type=prop_type) 
     pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name) 

     # Now use Django to pull the value back out.. 
     project = Project.objects.get(name=tree[1].name) 
     property = project.get_property(pmproperty) 
     self.assertEqual(pmvalue, property.value) 

     # This will do some external process which occcurs to the db. 
     pmproperty = "%s_%s_basic_two" % (tree[1].name, prop_type) 
     pm.add_property_definition(pmproperty, prop_type=prop_type) 
     pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name) 

     # Now use Django to pull the value back out.. 
     Project.objects.update() #CHANGE2 
     project = Project.objects.get(name=tree[1].name) 
     property = project.get_property(pmproperty) 
     self.assertEqual(pmvalue, property.value) 
+2

トランザクション... –

+0

これはこれの一部だったことが判明しました。分割することはできますか? – rh0dium

+0

公平のために、私はダニエルのコメントもアップアップします。 – rewritten

答えて

1

これはおそらくトランザクションの問題ではありません。マネージャー(Project.objects)には、短期間の生存が図られているため、データの変更を通知する必要があります。

同じクエリProject.objects.get(name=tree[1].name)を2回クエリしていますが、マネージャはすでに正しいデータがあると考えて再度実行しません。ただ、2番目のクエリの前に

、マネージャのキャッシュを無効にするために

Project.objects.update() 

を行います。無効化後の結果は最新である必要があります。

+0

これはそれの他の部分であったことが分かります。 – rh0dium

関連する問題