2016-03-10 11 views
6

Piszę mojego pierwszego Django aplikację, wykonując wraz z tej książki:render_to_string i response.content.decode() nie pasujące

http://chimera.labs.oreilly.com/books/1234000000754/ch05.html#_passing_python_variables_to_be_rendered_in_the_template

W książce znajduje się test, który sprawdza, że html jest zwracany tak, jak powinien. Tutaj jest test:

def test_home_page_returns_correct_html(self): 
     request = HttpRequest() 
     response = home_page(request) 
     expected_html = render_to_string('home.html') 
     print(expected_html) 
     print(response.content.decode()) 
     self.assertEqual(response.content.decode(), expected_html) 

Moja próba zawodzi na teście assertEqual bo dodałem csrf token w moim HTML przy użyciu Django Template Language. Oto co moja strona HTML wygląda następująco:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>To-Do lists</title> 
</head> 
<body> 
    <h1>Your To-Do list</h1> 
    <form method="POST"> 
      <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> 
      {% csrf_token %} 
    </form> 

    <table id="id_list_table"> 
     <tr><td>{{ new_item_list }}</td></tr> 
    </table> 
</body> 
</html> 

Moja assert się niepowodzeniem ze względu na metodę render_to_string nie wliczając tokena. Oto co moje dwa print stwierdzenia zawarte w moim testowym wydruku:

F<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>To-Do lists</title> 
</head> 
<body> 
    <h1>Your To-Do list</h1> 
    <form method="POST"> 
      <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> 

    </form> 

    <table id="id_list_table"> 
     <tr><td></td></tr> 
    </table> 
</body> 
</html> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>To-Do lists</title> 
</head> 
<body> 
    <h1>Your To-Do list</h1> 
    <form method="POST"> 
      <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> 
      <input type='hidden' name='csrfmiddlewaretoken' value='VAiGvXZLHCjxWEWdjhgQRBwBSnMVoIWR' /> 
    </form> 

    <table id="id_list_table"> 
     <tr><td></td></tr> 
    </table> 
</body> 
</html> 
F. 

On nie ma tego problemu w książce (on używa 1.8), więc zastanawiałem się, czy zachowanie metoda uległa zmianie, lub jak Napisałbym ten test do zaliczenia.

+1

Książka testowa Driven Development została oryginalnie napisana dla Django 1.7. Wygląda na to, że ta część mogła zostać pominięta, gdy książka została uaktualniona do wersji Django 1.8. – Alasdair

+4

autora tutaj. Właściwie jest to poprawne na 1.8, błąd pojawia się po zmianie na 1.9. instrukcje instalacji w książce wyraźnie mówią, że musisz trzymać się 1.8, mamrocząć narzekać ... – hwjp

+0

@hwjp Mój błąd, test przechodzi w Django 1.8, instrukcje instalacji wyraźnie mówią, aby trzymać się 1.8. Używałem Django 1.9, gdy myślałem, że testowałem 1.8. Ups! – Alasdair

Odpowiedz

5

Argument request został dodany do render_to_string w Django 1.8. Można spróbować zmienić linię w teście do:

expected_html = render_to_string('home.html', request=request) 

Jest to wymagane jedynie do dokonania tej zmiany w Django 1.9+, test przechodzi bez wniosku w Django 1.8.

+0

Myślę, że faktycznie został dodany w 1.9? książka jest poprawna dla wersji 1.8 ... – hwjp

+1

Argument "request" został dodany w wersji 1.8, ale wystarczy zaktualizować wiersz w Django 1.9+. Test kończy się bez 'request' w Django 1.8. – Alasdair

Powiązane problemy