2016-12-19 1 views
1

url 디스패치를 ​​사용하는 기존 피라미드 애플리케이션이 있습니다. 그것은 '/kind1/{id1}/kind2/{id2}.../action'형식의 URL을 가지고 있습니다. 따라서 순회는 이상적 이었지만 사용되지 않았습니다.urldispatch로 뷰 테스트 내부에서 컨텍스트 팩토리를 자동으로 지정하는 방법

각보기에는 url에서 인스턴스를 가져 오는 함수 호출이 있습니다. 예 : thingy_instance = get_thingy_from_url(request)

과 같은 통화가있을 수 있습니다.보기에 권한을 추가해야했습니다. 그래서 컨텍스트 팩토리를 라우트 구성에 추가했습니다. 같은 뭔가 : ThingyContext이 일을 인출하는 뷰 자체에서 나는 thingy_instance = get_thingy_from_url(request)

이 대신, thingy_instance = request.context.thingy_instance 같은 물건을 할 수 있도록 config.add_route('thingy_action','/kind1/{id1}/kind2/{id2}.../action', factory='ThingyContext')

는 이제 지금까지 꽤 똑바로 앞으로 행할, 감각을 만들 것입니다. 그러나 요청 컨텍스트가 채워되지 않기 때문에 직접 의견을 테스트하는 모든 단위 테스트를 나누기

예를 들어, 그래서 같은 시험 :.

:

def test_thingy_action_scenario(self): 
    stuff... 
    x = thingy_action(request) 

나에게 같은 예외를 줄 것이다

Traceback (most recent call last): 
    File "/home/sheena/Workspace/Waxed/waxed_backend/waxed_backend/concerns/accountable_basics/tests/view_tests.py", line 72, in test_alles 
    self.assertRaises(UserNotFound,lambda:get_user(request)) 
    File "/usr/lib/python2.7/unittest/case.py", line 473, in assertRaises 
    callableObj(*args, **kwargs) 
    File "/home/sheena/Workspace/Waxed/waxed_backend/waxed_backend/concerns/accountable_basics/tests/view_tests.py", line 72, in <lambda> 
    self.assertRaises(UserNotFound,lambda:get_user(request)) 
    File "/home/sheena/Workspace/Waxed/waxed_backend/waxed_backend/concerns/accountable_basics/views.py", line 69, in get_user 
    oUser = request.context.oUser 
AttributeError: 'NoneType' object has no attribute 'thingy_instance' 

요컨대. 테스트에서 request.context은 없음입니다. 그러나 URL을 통해보기에 액세스 할 때 모두 정상적으로 작동합니다.

예 : 이런 종류가

따라서이 처리의 우아한 방법은 무엇 curl -X POST --header 'Accept: application/json' 'http://stuff/kind1/{id1}/kind2/{id2}.../action/' 새로운 세트와 함께 작동? 보기 내부에서 컨텍스트를 사용하고 테스트를 통과하려고합니다.

답변

1

당신은 단위 테스트 대신 기능 테스트를 원합니다. 피라미드에서보기 자체는 "단순한 기능"이며 문맥을 채우는 데는 아무 것도하지 않습니다.이 모든 일이 일어난 후에는 피라미드의 라우터에서 호출됩니다. 그러나 이러한 테스트에서 라우터를 사용하지 않으므로 이러한 상황이 발생하지 않습니다.

단위 테스트에서 뷰 기능 자체를 테스트하려는 경우 테스트 세트 request.context = ThingyContext(...)을 사용하면보기가 행복해 야합니다.

컬링과 같은 클라이언트가 어떻게 테스트하는지 더 자세히 테스트하려면 웹 테스트를 사용하고 싶습니다.

from webtest import TestApp 

app = config.make_wsgi_app() 
testapp = TestApp(app) 
response = testapp.get('/') 

이렇게하면보기 기능뿐 아니라 전체 응용 프로그램이 필요합니다.

+0

처음부터 테스트를 작성했다면이 방법으로 할 것입니다. 하지만 이미 많은 수의 테스트를 거친 프로젝트를 진행하고 있습니다. 최대한 재 작성을 최소화하고 싶습니다. – Sheena

+0

유일하게 다른 옵션은 테스트에서'request.context = ...'입니다. 허용되는 것으로 표시하기 위해 여기에 필요한 다른 것을 선택해야합니다. –

+0

많은 테스트에 많은 코드를 복사하여 붙여 넣어야 할 것입니다. 너무 좋지 않습니다. – Sheena

관련 문제