문제

나는 양식을 제출할 수 있기를 원합니다. HTML 소스 (String). 다시 말해 최소한 우편 매개 변수를 생성 할 수있는 기능이 필요합니다. 양식의 HTML 소스를 포함하는 문자열에서. 이것은 Django 프로젝트의 단위 테스트에서 필요합니다. 나는 아마도 솔루션을 원합니다.

  • 표준 Python 라이브러리 및 Django 만 사용합니다.
  • 둘 이상의 양식이있는 경우 특정 양식에서 매개 변수 생성을 허용합니다.
  • 제출하기 전에 값을 변경할 수 있습니다.

주어진 양식 클래스에서 a (django) 양식 인스턴스를 반환하는 솔루션이 가장 좋습니다. 유효성 검사를 사용할 수 있기 때문입니다. 이상적으로는 소스 (문자열), 양식 클래스, 선택적으로 형식 이름을 소비하고 렌더링 전과 같이 인스턴스를 반환합니다.

참고 : 나는 이것이 쉬운 일이 아니라는 것을 알고 있으며, 아마도 이익은 필요한 노력을 거의 정당화 할 수 없을 것입니다. 그러나 나는 이것이 실용적이고 신뢰할 수있는 방식으로 어떻게 할 수 있는지 궁금합니다. 가능하다면.

도움이 되었습니까?

해결책

다시 읽어야합니다 Django의 테스트 프레임 워크에 대한 문서, 특히 뷰 테스트 (및 형태)에 대한 부분 테스트 클라이언트.

테스트 클라이언트는 간단한 웹 브라우저 역할을하며 GET 그리고 POST Django 조회수 요청. 응답 HTML을 읽거나 동일하게 얻을 수 있습니다. Context 템플릿을 수신 한 금액. 당신의 Context 객체에는 실제가 포함되어야합니다 forms.Form 찾고있는 인스턴스입니다.

예를 들어, URL에서의보기가 /form/ 컨텍스트를 통과합니다 {'myform': forms.Form()} 템플릿에 이런 식으로 얻을 수 있습니다.

from django.test.client import Client
c = Client()

# request the web page:
response = c.get('/form/')

# get the Form object:
form = response.context['myform']

form_data = form.cleaned_data
my_form_data = {} # put your filled-out data in here...
form_data.update(my_form_data)

# submit the form back to the web page:
new_form = forms.Form(form_data)
if new_form.is_valid():
    c.post('/form/', new_form.cleaned_data)

바라건대 그것은 HTML을 엉망으로 만들지 않고 원하는 것을 달성하기를 바랍니다.

편집하다: Django 문서를 형태에 대해 다시 읽은 후에는 형태가 불변이라는 것이 밝혀졌습니다. 그래도 괜찮아요. Form 인스턴스 및 제출; 코드 예제를 변경하여 이에 맞게 변경했습니다.

다른 팁

Django 테스트 프레임 워크가이를 수행하기 때문에, 당신이 무엇을 요구하는지 잘 모르겠습니다.

양식이있는 Django 앱을 테스트 하시겠습니까?

  • 이 경우 초기 GET을 수행해야합니다.
  • 결과 게시물이 뒤 따릅니다

다른 사이트에 양식을 제출하는 Django 앱을 작성하고 테스트하고 싶습니까?

다음은 양식으로 django 앱을 테스트하는 방법입니다.

class Test_HTML_Change_User( django.test.TestCase ):
    fixtures = [ 'auth.json', 'someApp.json' ]
    def test_chg_user_1( self ):
        self.client.login( username='this', password='this' )
        response= self.client.get( "/support/html/user/2/change/" )
        self.assertEquals( 200, response.status_code )
        self.assertTemplateUsed( response, "someApp/user.html")

def test_chg_user( self ):
    self.client.login( username='this', password='this' )
    # The truly fussy would redo the test_chg_user_1 test here
    response= self.client.post(
        "/support/html/user/2/change/",
        {'web_services': 'P',
         'username':'olduser',
         'first_name':'asdf',
         'last_name':'asdf',
         'email':'asdf@asdf.com',
         'password1':'passw0rd',
         'password2':'passw0rd',} )
    self.assertRedirects(response, "/support/html/user/2/" )
    response= self.client.get( "/support/html/user/2/" )
    self.assertContains( response, "<h2>Users: Details for", status_code=200 )
    self.assertContains( response, "olduser" )
    self.assertTemplateUsed( response, "someApp/user_detail.html")

참고 - HTML을 자세히 구문 분석하지 않습니다. 올바른 템플릿이 있고 올바른 응답 문자열이있는 경우 올바른 것이 좋습니다.

간단하고 동시에 힘들다.
면책 조항 : 나는 Python에 대해 많이 알지 못하고 Django에 대해 전혀 모른다 ... 그래서 나는 일반적인 언어 불가지론적인 조언을 제공합니다 ... 위의 조언 중 하나가 당신에게 효과가 없다면, 당신은 수동으로 그것을하고 싶을 것입니다. :

  • HTML 파서로 페이지를로드하고 양식을 나열하십시오.
  • 만약 method 속성은 POST (Case Insensitive)입니다. action 요청의 URL을 얻는 속성 (상대적 일 수 있음).
  • 형식으로 모든 것을 얻으십시오 input 그리고 select 태그. 그만큼 name (또는 id 이름) 속성이없는 경우 요청 매개 변수의 키입니다. 그만큼 value 속성 (결석이없는 경우 비어 있음)은 해당 값입니다.
  • 을 위한 select, 값은 선택된 것 중 하나입니다 option 또는 표시된 텍스트는 아니오입니다 value 기인하다.

이러한 이름과 값은 GET 요청에서 인코딩되어야하지만 게시물에는 URL이어야합니다.

HTH.

체크 아웃 기계화 또는 포장지입니다 능직. 나는 그것이 생각합니다 ClientForm 모듈이 당신을 위해 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top