2016-03-10 15 views
6

Tôi đang viết ứng dụng Django đầu tiên của tôi bằng cách làm theo cùng với cuốn sách này:Render_to_string và response.content.decode() không phù hợp với

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

Trong cuốn sách có một bài kiểm tra đó là xác định rằng các html đang được trả lại như nó được cho là. Đây là thử nghiệm:

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) 

thử nghiệm của tôi là không vào kiểm tra assertEqual vì tôi đã thêm một csrf token trong HTML của tôi bằng cách sử dụng Django Template Language. Dưới đây là trang HTML của tôi trông như thế nào:

<!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> 

Xác nhận của tôi không thành công do phương thức render_to_string không bao gồm mã thông báo. Đây là những gì hai print báo cáo của tôi bao gồm in thử nghiệm của tôi ra:

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. 

Anh ấy không có vấn đề này trong cuốn sách (ông đang sử dụng 1.8), vì vậy tôi đã tự hỏi nếu hành vi phương pháp đã thay đổi, hoặc làm thế nào Tôi sẽ viết bài kiểm tra này để vượt qua.

+1

Cuốn sách Phát triển thử nghiệm được viết ban đầu cho Django 1.7. Có vẻ như phần này có thể đã bị bỏ qua khi cuốn sách được nâng cấp lên Django 1.8. – Alasdair

+4

tác giả ở đây. nó thực sự chính xác cho 1,8, lỗi xảy ra khi bạn chuyển sang 1.9. các hướng dẫn cài đặt trong cuốn sách làm rõ ràng bạn phải dính vào 1,8, mumble grumble ... – hwjp

+0

@hwjp Lỗi lầm của tôi, kiểm tra không vượt qua trong Django 1.8, hướng dẫn cài đặt làm rõ ràng để dính vào 1,8. Tôi đã sử dụng Django 1.9 khi tôi nghĩ rằng tôi đã thử nghiệm 1.8. Rất tiếc! – Alasdair

Trả lời

5

Đối số request đã được thêm vào render_to_string trong Django 1.8. Bạn có thể thử thay đổi dòng trong thử nghiệm của mình thành:

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

Chỉ cần thực hiện thay đổi này trong Django 1.9+, thử nghiệm không được yêu cầu trong Django 1.8.

+0

Tôi nghĩ rằng nó thực sự được thêm vào 1.9? cuốn sách là chính xác cho 1.8 ... – hwjp

+1

Đối số 'request' được thêm vào 1.8, nhưng bạn chỉ cần cập nhật dòng trong Django 1.9+. Bài kiểm tra trôi qua mà không có 'yêu cầu' trong Django 1.8. – Alasdair

Các vấn đề liên quan