2017-09-07 12 views
1

異なるパラメータで関数をテストする必要があります。このための最も適切な方法は、with self.subTest(...)コンテキストマネージャを使用しているようです。Django TestCase:self.subTest(...)のデータベースを再作成

ただし、この関数はdbに何かを書きますが、矛盾した状態になります。私が書き込むものは削除することができますが、データベース全体を完全に再作成することができれば、よりクリーンになります。それを行う方法はありますか?

答えて

2

self.subTest()でデータベースを再作成する方法がわかりませんが、私が現在使用している別のテクニックがあります。フィクスチャを使用してデータベースの「スナップショット」を作成することができます。このスナップショットは、基本的にテスト目的でのみ使用される第2のデータベースにコピーされます。私は現在、この方法を使って仕事中の大きなプロジェクトでコードをテストしています。

これは実際にどのように見えるかを示すためのサンプルコードを投稿しますが、必要に応じてコードを調整するために余分なリサーチを行う必要があります(私は)。

このプロセスはかなり複雑です。あなたは、.yamlファイルに格納され、テストユニットのみがアクセスする、フィクスチャを使用して必要なデータだけでデータベースのコピーを作成します。

  1. リストアイテムを使用すると、器具を使用して、それを移入するためにあなたのテスト・データベースにコピーする:ここで

    は次のようにプロセスが見えるものです。これは、db全体を愚かにコピーするのではなく、必要なデータを持つdbを作成するだけです。それは.yamlファイルに格納されます。

generate.py

django.setup() 
    stdout = sys.stdout 

    conf = [ 
     { 
      'file': 'myfile.yaml', 
      'models': [ 
       dict(model='your.model', pks='your, primary, keys'), 
       dict(model='your.model', pks='your, primary, keys') 
      ] 
     } 
    ] 

    for fixture in conf: 
     print('Processing: %s' % fixture['file']) 
     with open(fixture['file'], 'w') as f: 
      sys.stdout = FixtureAnonymiser(f) 

     for model in fixture['models']: 
      call_command('dumpdata', model.pop('model'), format='yaml',indent=4, **model) 
      sys.stdout.flush() 

     sys.stdout = stdout 
テストユニットにおいて
  • 、固定具としてあなた発生.yamlファイルをインポートして、テストが自動的にこのデータを使用しますフィクスチャからテストを実行して、メインデータベースを変更しないでください。
  • test_class.py

    from django.test import TestCase 
    
    class classTest(TestCase): 
    
        fixtures = ('myfile.yaml',) 
    
        def setUp(self): 
         """setup tests cases""" 
         # create the object you want to test here, which will use data from the fixtures 
    
        def test_function(self): 
         self.assertEqual(True,True) 
         # write your test here 
    

    あなたはもっとここまで読むことができます:

    あなたの場合物事が不明確であるだけの質問があるので、私はあなたを助けてくれるでしょう。

    +1

    ありがとうございます。私はそれをよく見るためにある程度の時間が必要です。私はそれを理解するとすぐにそれを受け入れます。 – Ibolit

    +0

    はい、当然のことながら、完全なコードが正しく動作するのを見るまでは、まったく混乱しています。そのため、疑問と私はあなたを正しい方向に導こうとします。 –

    +0

    @Ibolitあなたは何かを働かせたり、別の解決策を見つけることができましたか? –

    関連する問題