Django中的测试GET和POST请求
大家好,我需要你们的帮助。因为我还是个新手,正在用Django做我的第一个应用程序,在测试的时候遇到了一些问题。主要是测试视图的时候出现了问题,手动测试一切正常,但在自动化测试时就出问题了。
我觉得问题可能和POST和GET请求有关,因为我做的很多操作都是基于GET请求,甚至那些会改变数据库的操作也用GET请求。POST请求我只用在表单提交上。当我开始测试时,所有的操作似乎都没有效果,就像那些GET请求根本不工作一样。
下面是代码:
视图:
@login_required
def new(request):
if request.method == "POST":
player = Player.objects.get(name=request.user)
hosted = Game(host=player.nick)
form = CreateGame(instance=hosted, data=request.POST)
if form.is_valid():
form.save()
return redirect("home", name="new_room")
@login_required
def delete_room(request, id):
game = Game.objects.get(id=id)
player = Player.objects.get(name=request.user)
if player.nick == game.host and game.how_many_players_ready == 0:
if not game.is_played:
game.delete()
return redirect("home", name="game_deleted")
else:
return redirect('detail', id=game.id)
else:
return redirect('detail', id=game.id)
测试:
class TestViews(TestCase):
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(username='testuser', password='12345')
self.user2 = User.objects.create_user(username='testuser2', password='12345')
usr = self.user
self.client.login(username='testuser', password='12345')
self.player = Player.objects.create(name=usr, parent = usr.username, nick = 'nie')
def test_create_many_rooms(self):
#this one works -> POST
self.new_room=reverse('new_room')
self.client.post(self.new_room, {'name' :'mariaczi', 'host':'mario'})
self.client.post(self.new_room, {'name': 'mariaczi2','host':'mario'})
self.client.post(self.new_room, {'name': 'mariaczi3', 'host': 'mario'})
suma = Game.objects.all().count()
self.assertEquals(suma,3)
def test_host_delete_empty_room(self):
#this one not
game = Game.objects.create(name='empty', host='testuser', is_played=False, max_players=4)
self.delete_room = reverse('delete_gam', args=[game.id])
self.client.get(self.delete_room, follow=True)
suma = Game.objects.all().count()
self.assertEquals(suma,0)
结果:======================================================================
FAIL: test_host_delete_empty_room (game.tests.test_views.TestViews)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/dottore/PycharmProjects/Nowa_gra/Nova_gra/game/tests/test_views.py", line 53, in test_host_delete_empty_room
self.assertEquals(suma,0)
AssertionError: 1 != 0
模型:
class Game(models.Model):
name = models.CharField(max_length=150)
host = models.CharField(max_length=10)
is_played = models.BooleanField(default = False)
max_players = models.IntegerField(default=4)
who_is_ready = models.ManyToManyField(Player, related_name="guys_ready", blank=True)
who_is_playing = models.ManyToManyField(Player, related_name="guys_playing", blank=True)
turn = models.IntegerField(default=1)
turn_of_player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='czyja_tura', blank=True, null=True)
@property
def how_many_players_ready(self):
return self.who_is_ready.count()
@property
def how_many_players_playing(self):
return self.who_is_playing.count()
@property
def players_ready(self):
return list(self.who_is_ready.all())
@property
def players_playing(self):
return list(self.who_is_playing.all())
@property
def players_playing_str(self):
res = [i.nick for i in self.who_is_playing.all()]
return res
@property
def first_player(self):
return self.players_playing[0]
@property
def second_player(self):
return self.players_playing[1]
@property
def third_player(self):
return self.players_playing[2]
@property
def forth_player(self):
return self.players_playing[3]
@property
def next_player(self):
x = self.players_playing.index(self.turn_of_player)
nast= x+1
if nast > (self.how_many_players_playing - 1):
self.turn +=1
self.save()
return self.players_playing[0]
else:
return self.players_playing[x+1]
def __str__(self):
return self.name
问题出在哪里呢?我是不是应该用其他方式来处理数据库的变化,而不是用GET请求?
相关问题:
- 暂无相关问题
1 个回答
1
这里没有什么特别的技巧……我觉得游戏对象没有被删除,你的 delete_room
里有很多的 if-else 语句。一个常用的调试方法是在每个 if 和 else 条件里加一个打印语句,这样你就可以看到程序走了哪个路径。
我怀疑问题出在这个 if 条件的第一部分,
if player.nick == game.host this will result in "nie" == "testuser"
它们是不相等的。不过你可以自己用打印语句来找出问题所在。