2012-11-11 3 views
1

사용자가 특정 범위에 대한 액세스 권한을 부여한 후 내 응용 프로그램이 물건을 처리 할 수있는 oauth 플로우가 있습니다. 이 작업을 수행하려면 정의 된 범위의 액세스 토큰이 필요합니다. 이것을 (django allauth 패키지로) 구현했으며 훌륭하게 작동합니다. 하지만 ... 시험을하고 싶습니다.장고의 oauth 흐름을 통한 단위 테스트

login = self.client.login(username='test_user', password='test') 
    self.assertTrue(login) 

    resp = self.client.post(reverse('oauth_login')) 
    self.assertEqual(resp.status_code, 302) 

    payload = {'session_key': 'email', 'session_password': 'pw', } 

    resp2 = requests.post(resp['location'], data=payload) 

    resp3 = self.client.get(reverse('do_stuff_with_access_token')) 
    self.assertEqual(resp.status_code, 302) 

여기에 문제 것은 내가 내 요청 변수의 액세스 토큰을 얻을 수 없다는 것입니다 : 이것은 내가 (요청 패키지는 스테로이드에 URLLIB처럼) 지금까지 가지고있는 것입니다. 내 생각 엔 응용 프로그램의 범위를 벗어나고 Django는 요청 범위에서 변수를 얻지 못한다는 것입니다.

어떻게하면 이것을 우아하게 테스트 할 수 있습니까? access_token을 조롱하는 것은 나에게 약간 잘못된 것 같습니다. 나는 지금 양식을 작성하기 위해 셀레늄을 시도하고 있지만, 심지어는 지금까지 성공하지 못했습니다 ...

고마워요!

+0

어떤 OAuth 라이브러리를 사용하고 있습니까? –

+0

조롱이 왜 잘못 보입니까? 원격 서비스를 테스트하지 않고 응용 프로그램이 원격 서비스의 응답 및 실패를 처리하는 방법을 테스트하고 있습니다. 조롱을위한 완벽한 사용 사례 인 것 같습니다. –

+0

@DanielRoseman 나는 django allauth를 사용하고있다. 그것이 oauth를 얼마나 정확히 구현하는지 모르겠다. 당신이 부르는 서비스에 의존하고있는 것 같아. – zwervertje

답변

1

명예의 전당!

도중에 다른 사람을 도울 수 있습니다. 조롱을했습니다. 제 경우에는 (django 1.4) 세션에 토큰을 추가해야합니다. 다른 조언의 많은은 인터넷에서 찾았지만 나는 간단한 일을 좋아하고이 적어도 테스트 스위트 장고에서 작동 할 수있다 : 나는이 같은 문제에 직면 다음과 같은 해결 내 딜레마를 발견

session = self.client.session 
session['request_token'] = {...} 
session['access_token'] = {...} 
session.save() 
1

:

user = User.objects.get(username='lauren') 
client = APIClient() 
client.force_authenticate(user=user) 

이 은 장고 문서에서 직접 찍은 :

http://www.django-rest-framework.org/api-guide/testing/#force_authenticateusernone-tokennone

불행하게도 그것은 검색의 숫자를했다 이 시점에 도달하기 전에. 나는 이것이 다른 누군가를 구원하기를 희망한다.

+0

우아한 접근 방식 인 것 같습니다. 멋지다! 공유 해줘서 고마워! – zwervertje

+0

사람들은 여전히 ​​검색 중에이 답변을 찾지 만 사용자에게 'request.session'을 연결시키지 않으므로 APIClient를 통해 get/post 작업까지 사용자 개체가 인증 된 것으로 표시되어있는 반면 이 사용자는 아직 존재하지 않습니다. 실제 세션 관련 사용자가 아닌 로컬 변수 일뿐입니다. –