Django中的测试GET和POST请求

0 投票
1 回答
548 浏览
提问于 2025-06-18 04:01

大家好,我需要你们的帮助。因为我还是个新手,正在用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" 

它们是不相等的。不过你可以自己用打印语句来找出问题所在。

撰写回答