2010-07-01 28 views
7

Tôi muốn đơn vị kiểm tra chế độ xem django bằng cách tổng hợp một biểu mẫu. Vấn đề là hình thức này có một trường captcha (dựa trên django-đơn giản-captcha).Làm thế nào để đơn vị kiểm tra một hình thức với một lĩnh vực captcha trong django?

from django import forms 
from captcha.fields import CaptchaField 

class ContactForm(forms.forms.Form): 
    """ 
    The information needed for being able to download 
    """ 
    lastname = forms.CharField(max_length=30, label='Last name') 
    firstname = forms.CharField(max_length=30, label='First name') 
    ... 
    captcha = CaptchaField() 

Mã kiểm tra:

class ContactFormTest(TestCase): 

    def test_submitform(self): 
     """Test that the contact page""" 
     url = reverse('contact_form') 

     form_data = {} 
     form_data['firstname'] = 'Paul' 
     form_data['lastname'] = 'Macca' 
     form_data['captcha'] = '28if' 

     response = self.client.post(url, form_data, follow=True) 

Có bất kỳ phương pháp để đơn vị kiểm tra mã này và thoát khỏi những hình ảnh xác thực khi kiểm tra?

Cảm ơn trước

+0

Trong trường hợp những người khác kết thúc ở đây như tôi đã làm, tôi tình cờ gặp bài đăng này cố gắng tìm một câu trả lời tương tự cho gói 'django-recaptcha'; hóa ra họ cũng có một thiết lập. Tài liệu của họ mô tả cách sử dụng của nó: https://github.com/praekelt/django-recaptcha –

Trả lời

6

Đây là cách tôi có được. Nhập khẩu các mô hình mà thực sự nắm giữ thông tin Captcha:

from captcha.models import CaptchaStore 

Trước tiên, tôi kiểm tra xem bảng thử nghiệm mã xác nhận khác rỗng:

captcha_count = CaptchaStore.objects.count() 
self.failUnlessEqual(captcha_count, 0) 

Sau khi tải trang (trong trường hợp này, đó là một trang đăng ký), kiểm tra xem có một đối tượng hình ảnh xác thực mới không:

captcha_count = CaptchaStore.objects.count() 
self.failUnlessEqual(captcha_count, 1) 

Sau đó, tôi truy xuất dữ liệu mẫu hình ảnh xác thực và POST với biểu mẫu. Trong trường hợp của tôi, POST mong đợi 'captcha_0' chứa hashkey và 'captcha_1' để chứa phản hồi.

captcha = CaptchaStore.objects.all()[0] 
registration_data = { # other registration data here 
        'captcha_0': captcha.hashkey, 
        'captcha_1': captcha.response } 

Bạn có thể cần điều chỉnh điều này một chút nếu bạn bắt đầu với trường hợp CaptchaStore trước khi bạn chạy thử nghiệm này. Hy vọng rằng sẽ giúp.

+0

Cách tôi đã làm (trước khi nhận thấy câu trả lời của bạn) là phân tích cú pháp biểu mẫu không liên kết HTML 'dom = PyQuery (' {}' .format (f.as_p())', lấy hàm băm từ đó 'hashkey = dom ('input [name =" captcha_0 "]'). attr ('value ') 'và sau đó truy vấn cơ sở dữ liệu bằng cách sử dụng nó. Phần còn lại là chủ yếu giống nhau.Hy vọng nó hy vọng ai đó. – alfetopito

1

Một giải pháp có cài đặt "kiểm tra" đúng hoặc sai. Và sau đó chỉ cần

if not testing: 
    # do captcha stuff here 

Thật đơn giản và dễ dàng và dễ dàng chuyển đổi.

+0

Nó hoạt động nhưng cài đặt.UNIT_TEST = Đúng phải được đặt trước khi nhập biểu mẫu trong mô-đun thử nghiệm.Đó là nguyên nhân của sai lầm của tôi – luc

+1

bạn cũng có thể đặt thử nghiệm trong tệp cài đặt: 'if" test "trong sys.argv: TESTING = True' – leech

0

Với một cách tiếp cận tương tự so với Jim McGaw nhưng sử dụng BeautifulSoup:

from captcha.models import CaptchaStore 
from BeautifulSoup import BeautifulSoup 

data = {...} #The data to post 
soup = BeautifulSoup(self.client.get(url).content) 
for field_name in ('captcha_0', ...): #get fields from the form 
    data[field_name] = soup.find('input',{'name':field_name})['value'] 
captcha = CaptchaStore.objects.get(hashkey=data['captcha_0']) 
data['captcha_1'] = captcha.challenge 
response = self.client.post(url, data=data) 

# check the results 
... 
10

Tôi biết đây là một bài cũ, nhưng django-đơn giản-mã xác nhận khác bây giờ có một CAPTCHA_TEST_MODE thiết lập mà làm cho hình ảnh xác thực thành công nếu bạn cung cấp giá trị 'PASSED'. Bạn chỉ cần đảm bảo gửi nội dung nào đó cho cả hai trường nhập captcha:

post_data['captcha_0'] = 'dummy-value' 
post_data['captcha_1'] = 'PASSED' 
self.client.post(url, data=post_data) 

Chỉ nên sử dụng cài đặt CAPTCHA_TEST_MODE trong khi kiểm tra. Cài đặt của tôi.py:

if 'test' in sys.argv: 
    CAPTCHA_TEST_MODE = True 
1

Một giải pháp khác tương tự như câu trả lời của Jim McGaw nhưng loại bỏ nhu cầu bảng trống Bảng CaptchaStore.

captcha = CaptchaStore.objects.get(hashkey=CaptchaStore.generate_key()) 

registration_data = { # other registration data here 
       'captcha_0': captcha.hashkey, 
       'captcha_1': captcha.response } 

Điều này sẽ tạo hình ảnh xác thực mới chỉ cho thử nghiệm đó.

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