2016-07-28 16 views
1

機能テストでSeleniumを使用してレンダリングすると、テンプレートと異なる結果になります。通常、ページにアクセスすると、レンダリングされているオブジェクトが表示されます。機能テスト中、ページは空白です(空の節にテキストを表示しません)。私は小さなDjangoアプリを使ってテストし、私が狂っていないことを確認しています。一貫して問題。Djangoテンプレート内の逆の関係が散発的にレンダリングする

モデル:

class M(models.Model): 
    pass 


class N(models.Model): 
    m = models.ForeignKey(
     M, 
     null=True, 
     default=None, 
     ) 

ビュー:

def view_my_problem(request): 
    ms = M.objects.all() 
    context = {'ms': ms} 
    return render(request, 'my_problem_template.html', context) 

テンプレート: 'Nオブジェクト':問題と

<html> 
    {% for m in ms %} 
     {% for n in m.n_set.all %} 
      {{ n }} 
     {% empty %} 
      THIS IS EMPTY 
     {% endfor %} 
    {% endfor %} 
</html> 

とテストは、(AssertionErrorが」で失敗します'' 'には見つかりません):

class FunctionalTest(StaticLiveServerTestCase): 

    @classmethod 
    def setUpClass(cls): 
     for arg in sys.argv: 
      if 'liveserver' in arg: 
       cls.server_url = 'http://' + arg.split('=')[1] 
       return 
     super().setUpClass() 
     cls.server_url = cls.live_server_url 

    @classmethod 
    def tearDownClass(cls): 
     if cls.server_url == cls.live_server_url: 
      super().tearDownClass() 

    def setUp(self): 
     self.browser = webdriver.Firefox() 
     self.browser.implicitly_wait(10) 

    def tearDown(self): 
     self.browser.close() 

    def test_my_problem(self): 
     m = M() 
     m.save() 
     n = N(m=m) 
     n.save() 
     self.assertEqual(N.objects.count(), 1) 
     self.assertEqual(M.objects.count(), 1) 
     self.assertEqual(m.n_set.count(), 1) 
     text = self.browser.find_element_by_tag_name('html').text 
     self.assertIn('N object', text) 

しかし、テストでテンプレートを手動でレンダリングすると問題はありません。テストの実行中ではなく通常のようなページを訪れても問題ありません。私は、ビューの中で前もって値を構成し、定数を繰り返し処理することができますが、なぜこれが機能しないのか不思議です。何が起きてる?

+1

しかし、テストを実行すると何がレンダリングされますか? –

+0

@ShangWang上記で、私はそれが "AssertionError: 'N object'が ''"に見つかりませんでした。したがって、空の文字列でレンダリングされます。 (編集:「Vladmirが指摘しているように、私は実際にURLを取得するのを忘れていたので、私のソフトウェアがこの例で持っていた問題を再現することができませんでした。障害) – Terrence

答えて

0
self.browser.get(self.live_server_url) 
text = ... 
+0

まあ、私は気が気になりません。ソフトウェアが持っていた問題を再現していると思っていましたが、別の問題が発生しました。ありがとうございました。 – Terrence

関連する問題