【发布时间】:2016-08-29 07:01:42
【问题描述】:
我正在尝试为 Django 应用程序编写一个集成测试,以测试密码是否从其他 API 更改。但是,调用密码修改API后,新密码测试不起作用。
我在这里做的是:我通过rest call将密码更改为johnjohn,然后尝试检查密码是否真的被更改了
我的单元测试文件
import json
import urllib
import urllib2
import requests
from django.contrib.auth.models import User
from django.test import TestCase
from adaptors.redis_class import DjangoRedis
class PasswordChange(TestCase):
def setUp(self):
User.objects.create_user(username='john', email='john@john.com', password='john')
# class for redis access
r = DjangoRedis()
r.set("email:john@john.com", '0' * 40, ex=3600)
r.set('0' * 40, "email:john@john.com", ex=3600)
def test_change_password(self):
# Fake url I set through redis
url = 'http://127.0.0.1:8000/reset/' + '0' * 40 + '/'
r = requests.get(url)
csrf_token = r.content.split('csrf_token')[1].split('"')[2]
payload = {'csrfmiddlewaretoken': csrf_token, 'payload': json.dumps({'password': 'johnjohn'})}
headers = {'Cookie': 'csrftoken=' + csrf_token}
data = urllib.urlencode(payload)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
json_res = json.loads(response.read())
# This doesn't fail
self.assertEqual(json_res['password_changed'], True)
u = User.objects.get(username='john')
# This fails
self.assertEqual(u.check_password('johnjohn'),True)
我的看法
import hashlib
import random
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404
from django.http import JsonResponse
from django.shortcuts import render
from django.views.generic import View
from adaptors.redis_class import DjangoRedis
from constants import PASSWORD_RESET
from tasks import send_email
from util.rest import get_payload
class ResetPage(View):
def post(self, requests, reset_token):
r = DjangoRedis()
token = r.get(reset_token)
if token is None:
return JsonResponse({"token": False})
payload = get_payload(requests.POST)
try:
email = token.split(':')[1].lower()
u = User.objects.get(email=email)
u.set_password(payload['password'])
u.save()
r.delete(reset_token)
r.delete('email:' + email)
return JsonResponse({'password_changed': True})
except ValueError:
return JsonResponse({"password_changed": False, 'error': "can't get your email from the database (E01)"})
except ObjectDoesNotExist:
return JsonResponse({"password_changed": False, 'error': "User doesn't exist (E02)"})
def get(self, requests, reset_token):
r = DjangoRedis()
if not r.get(reset_token):
raise Http404
return render(requests, "login/reset.html", {'token': reset_token})
unittest 文件在unittests 目录中称为rest_pass_login_tests.py。
我使用以下命令运行它。
./manage.py test unittests/ --pattern="rest_pass_login_tests.py"
当我通过浏览器正常测试时,密码更改工作正常。但是,当我尝试通过单元测试检查密码是否已更改时,我得到一个无效的密码。
我做错了什么?
【问题讨论】:
-
你为什么不用 django 测试客户端而不是 urllib?
-
我正在使用 selenium,并且我将代码更改为使用 urllib。但是,您对 django 测试客户端是正确的
标签: django python-unittest django-unittest