2016-03-29 19 views
0

IRC'de bu sorunu çözemedim, buradaki bazı yönergeleri bulabileceğimi umuyordum.Birim Sınama Önyükleme Modal Yönlendirmesi

def test_validation_errors_return_hops_list_page(self): 
    response = self.client.post(
     '/beerdb/add/hops', 
     data={ 
      'name': '', 
      'min_alpha_acid': '', 
      'max_alpha_acid': '', 
      'country': '', 
      'comments': '' 
     }, follow=True 
    ) 

    self.assertEqual(response.status_code, 200) 
    self.assertTemplateUsed(response, 'homebrewdatabase/addhops.html') 
    name_validation_error = escape("A hop name is required") 
    min_alpha_acid_error = escape("You must enter a min alpha acid") 
    max_alpha_acid_error = escape("You must enter a max alpha acid") 
    country_error = escape("You must enter a country") 
    comments_error = escape("You must enter a comment") 

    self.assertContains(response, name_validation_error) 
    self.assertContains(response, min_alpha_acid_error) 
    self.assertContains(response, max_alpha_acid_error) 
    self.assertContains(response,country_error) 
    self.assertContains(response, comments_error) 

O self.assertContains(response, name_validation_error) üzerinde başarısız oluyor: Aşağıdaki test var. Form geçersiz olduğunda

Failure 
Traceback (most recent call last): 
File "/Users/USER/workspace/PycharmProjects/hashtagbrews/homebrewdatabase/tests/test_views.py", line 189, in test_validation_errors_return_hops_list_page 
self.assertContains(response, name_validation_error) 
File "/Users/USER/workspace/Envs/hashtagbrews/lib/python3.4/site-packages/django/test/testcases.py", line 398, in assertContains 
msg_prefix + "Couldn't find %s in response" % text_repr) 
AssertionError: False is not true : Couldn't find 'A hop name is required' in response 

views.py içinde Bence hataları ile hops.html şablonu oluşturur: Burada iz geri döndü el site üzerinden tıkladığınızda

def addhops(request): 

    add_form = HopForm(request.POST or None) 

    if request.method == 'POST': 
     if add_form.is_valid(): 
      Hop.objects.create(name=request.POST['name'], 
          min_alpha_acid=request.POST['min_alpha_acid'], 
          max_alpha_acid=request.POST['max_alpha_acid'], 
          country=request.POST['country'], 
          comments=request.POST['comments'] 
          ) 
     return redirect('hops_list') 
    else: 
     hops_list = Hop.objects.all() 
     return render(request, 'homebrewdatabase/hops.html', {'hops': hops_list, 'form': add_form}) 
return render(request, 'homebrewdatabase/addhops.html', {'form': add_form}) 

, tam olarak ne olsun ben 'm arıyoruz: modaldan ana atlama sayfa listesi listesine, add_hops.errors hatalarının sırasız bir listesini içeren üst kısımdaki Bootstrap uyarı kutusuyla bir yönlendirme. İstek sonrası (self.client.post('url', data={invalid data})) yanıtı yazdırdım ve yalnızca kalıcı formu içerir. Bu testi bitirmek için uygun yöntem ne olurdu? Veya form doğrulamamı yeniden yazmam gerekiyor mu?

+0

terminalinizi temizleyin, 'response response 'sonra' print response' yazın ve sonra sadece bu testi çalıştırın. Sonra, iddia ettiğiniz şeyin basılı çıktıda olup olmadığını kontrol edin - ilk iddianızda başarısız olmanız nedeniyle, her şey olabilir, örn. sayfa değil vb. –

+0

da url'leri tersine çevirmek için iyi bir fikir '/ beerdb/add/hops ' –

+0

Sorun, şüphelendiğim gibi response.context [' request ']. 'İstek' olarak okunur:

cevap

0

Burada açıklanan, yorumlarda belirtildiği gibi, Django test istemcisinin, posta isteğini gerçekleştirdikten sonra addhops görünüm yönteminde bir GET isteği çalıştırmasıdır. Görünüm mantığına göre, yöntem POST değilse, o zaman tasarım tarafından form hataları içermeyen bootstrap modal verir. Yani test müşterisini kullanırken test başarısız olur. Ancak, sınama, bir POST isteğinde geçersiz veri göndermek için HttpRequest nesnesini kullanın ve sonra içeriğin form hataları içerdiğini doğrulayın. Bu yüzden

ben assertTemplateUsed olarak kullanılan şablonu iddia edemez
def test_validation_errors_return_hops_list_page(self): 
    request = HttpRequest() 

    request.method = 'POST' 
    request.POST['name'] = '' 
    request.POST['min_alpha_acid'] = '' 
    request.POST['max_alpha_acid'] = '' 
    request.POST['country'] = 'USA' 
    request.POST['comments'] = '' 

    response = addhops(request) 

    self.assertEqual(response.status_code, 200) 
    name_validation_error = escape("A hop name is required") 
    min_alpha_acid_error = escape("You must enter a min alpha acid") 
    max_alpha_acid_error = escape("You must enter a max alpha acid") 
    comments_error = escape("You must enter a comment") 

    self.assertContains(response, name_validation_error) 
    self.assertContains(response, min_alpha_acid_error) 
    self.assertContains(response, max_alpha_acid_error) 
    self.assertContains(response, comments_error) 

testi müşteriye ait olan bir yöntemdir, ancak selenyum ile benim fonksiyonel testler için yeterli olmalıdır passes-- aşağıdaki kullanmak için testi yeniden yazdı Gerekli öğelerin işlenmiş görünümde olduğunu kontrol edin. Bunun gelecekte değiştirilmesi gerekebilir, ancak şimdilik çalışmak için yeterlidir.

+0

bunu başardığına sevindim. AssertTemplateUsed yerine, # form kimliğinizin yanıtta olduğunu kontrol edebilirsiniz. –

+0

Teşekkürler, bunu deneyeceğim. Modalın gerçekten gelip gelmediğini görmek için response.content'imi tekrar kontrol etmem gerekiyor. Modal içeriği aynı şablonda saklamam, daha sonra modal çağrıları ana sayfaya koyup modalları kendi şablonlarına ayırdım. . Muhtemelen bir noktada ekleme/düzenleme ve silme işlemlerini birleştiririm. –

İlgili konular