python - 如何测试视图是否能够在数据库中创建新实体?
问题描述
我必须进行基本的单元测试才能使我的代码覆盖率更高。我不需要做任何花哨的事情。只需要最低限度。所以,在这种情况下,如果我能够成功地击中我的视图,那么这就是我需要做的。如您在 models.py 中所见,敏捷团队嵌套在 Team 下。
模型.py -
class Organization(models.Model):
orgname = models.CharField(max_length = 100, blank=True)
def __str__(self):
return str(self.orgname)
class Team(models.Model):
teamID = models.AutoField(primary_key=True)
teamName = models.CharField(max_length = 100, blank=True)
org = models.ForeignKey(Organization, on_delete=models.CASCADE)
def __str__(self):
return str(self.teamName)
class AgileTeam(models.Model):
agileTeamID = models.AutoField(primary_key=True)
agileTeamName = models.CharField(max_length = 100, blank=True)
team = models.ForeignKey(Team, on_delete=models.CASCADE)
def __str__(self):
return str(self.agileTeamName)
视图.py -
@csrf_exempt
def newATeam(request):
if request.method == 'POST':
param = json.loads(request.body)
agileteam = param.get('agileteam')
teamname = param.get('teamname')
team = Team.objects.get(teamName = teamname)
AgileTeam.objects.create(agileTeamName=agileteam, team=team)
return JsonResponse(status = 200, data = {})
urls.py -
path('ajax/newATeam/', views_admin.newATeam, name='ajax_newATeam'),
test_views.py -
class TestViews(TestCase):
@classmethod
def setUpTestData(self):
# set-up org
ORG_NAMES = ['REVCYCSCH', 'DIABLO', 'BROTHERHOOD']
for org in ORG_NAMES:
Organization.objects.create(orgname=org)
# set-up team
orgModels = Organization.objects.all()
TEAM_NAMES = ['Blitzkrieg ', 'Hammerheads', 'Mercenaries']
for i in range(len(TEAM_NAMES)):
Team.objects.create(teamName=TEAM_NAMES[i], org=orgModels[i])
# set-up agileteam
teamModels = Team.objects.all()
AGILE_TEAM_NAMES = ['Barons', 'Exterminators ', 'Mavericks', 'Renegades', 'Stratosphere', 'Trojans ']
index = 0
for team in teamModels:
for _ in range(2):
AgileTeam.objects.create(agileTeamName=AGILE_TEAM_NAMES[index], team=team)
index = index + 1
self.client = Client()
def test_newATeam(self):
params = {'agileteam': 'Barons', 'teamname': 'Blitzkrieg'}
response = self.client.post(path = '/ajax/newATeam/', data = params, content_type = 'application/json')
self.assertEqual(response.status_code, 200)
但是,我收到此错误 - 错误
提前致谢!
解决方案
我会做一些稍微不同的事情。
在views.py
:
@csrf_exempt
def new_agile_team(request):
if request.method == 'POST':
if request.META.get('CONTENT_TYPE', '').lower() == 'application/json' and len(request.body) > 0:
try:
body_data = json.loads(request.body.decode('utf-8'))
except Exception as e:
return HttpResponseBadRequest(json.dumps({
'error': 'Invalid request: {0}'.format(str(e))
}), content_type="application/json")
try:
team = Team.objects.get(teamName = teamname)
AgileTeam.objects.create(agileTeamName=agileteam, team=team)
except Team.DoesNotExist as error:
# Handle error here...
return JsonResponse(status = 200, data = {})
但是,我强烈建议为此使用 Djago REST 框架 - 因为您可能只需要为登录用户提供创建团队的能力,因此您需要了解@action
路由的级别权限,以及使用更多的 RESTful 原则。
推荐阅读
- pandas - 对两个日期时间列求和
- simulation - Chisel PeekPokeTester 中的 Printf 在同一 RTL 上的行为与 verilator 不同
- scala - 如何转换数组
使用 Scala 到 Spark 数据帧中的 BinaryType - android - 错误状态和正常状态有不同颜色的提示
- python - 如何在 if 函数中打印一些数字?
- flutter - 如何获得具有重复数字的数字的所有组合?
- r - 尝试使用 get() 函数时未找到对象错误
- mongodb - 优化设置和项目操作
- java - Firestore 选项 - setTimestampsInSnapshotsEnabled() 已弃用
- mysql - 完成所有任务。仅当用户是使用 sql 发布的最后一条评论时。可能吗?