2016-01-24 85 views
1

我開始爲我的金字塔的看法(使用webtest)編寫測試,並從Django的背景來我有一個困難時期試圖瞭解如何測試某些變量有已傳遞給模板。 例如讓我們考慮這樣的觀點:如何使用查詢模板背景金字塔+ WebTest的

@view_config(route_name='login_or_signup', renderer='login_or_signup.html') 
def login_or_sign_up(request): 
    if request.method == 'POST': 
     try: 
      do_business_logic() 
      return HTTPFound(location=next) 
     except Invalid as e: 
      request.response.status_code = 400 
      return dict(form_errors=e.asdict()) 
    return {} 

我如何寫一個測試,證明了如果表格不正確,一個form_errors字典傳遞到模板?在Django中我會使用context屬性,但在金字塔/ WebTest的我無法找到任何類似的......看來,模板的數據不通過響應對象訪問。我爲了訪問這些數據中發現的唯一的事情就是通過事件偵聽器:

@subscriber(BeforeRender) 
def print_template_context(event): 
    for k, v in event.rendering_val.items(): 
     print(k, v) 

但我認爲這是不使用此方法,因爲可行:

  1. 這是一個全球性的聽衆
  2. 它具有響應對象

所以進不去......我試圖擴展基Response類(以額外的字段附加到它):

class TemplateResponse(Response): 
    def __init__(self, template, template_context=None, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.template = template 
     self.template_context = template_context or {} 
     self.text = render(self.template, self.template_context, self.request) 

,並改變原有的以:

@view_config(route_name='login_or_signup') 
    def login_or_sign_up(request): 
     if request.method == 'POST': 
      try: 
       do_buisness_logic() 
       return HTTPFound(location=next) 
      except Invalid as e: 
       return TemplateResponse(
        'login_or_signup.html', 
        dict(form_errors=e.asdict()), 
        status=400 
      ) 
     return TemplateResponse('login_or_signup.html') 

但它的無奈,因爲WebTest的返回自己的TestResponse對象,而不是我的TemplateResponse ...所以我怎麼能測試模板中的數據?

回答

0

儘管我並不完全滿意,我現在同時使用WebTest的和默認金字塔測試utils的解決:

template_request = DummyRequest(path='/login-signup', post=data) 
template_context = LoginSignupView(template_request).post() 
response = self.app.post('/login-signup', data, status=HTTPBadRequest.code) 
self.assertEqual(response.status_code, HTTPBadRequest.code) 
self.assertIsInstance(template_context['form_errors'], dict) 

DummyRequest被直接傳遞給視圖,它只是返回一個包含模板變量的字典。而不是實際的「導航」委託給TestApp實例,它是能夠取回已呈現實際的HTML響應。