测试时不应该传入Django

时间:2015-02-10 19:12:53

标签: python django unit-testing

我刚刚开始使用Django并且认为也许有人可以启发我关于我写的应该通过的简单测试,但显然不会。嗯,我说这应该是Django的新手,我想我缺乏知识就是失败的原因。

我使用另一个模型和一对一关系扩展了django用户模型,如文档中所建议的那样,为模型添加一个字段。该模型,即UserStep,只包含一个从零开始的整数。我决定扩展管理器以实现一个名为setUserStep的方法,该方法在满足条件时将步骤设置为新值。

models.py

class UserStepManager(models.Manager):
    def setUserStep(self, user, conditional_step, step):
        if user.userstep.step == conditional_step:
            user.userstep.step = step
            user.userstep.save()


class UserStep(models.Model):
    """This model holds the user step count"""
    user = models.OneToOneField(User)
    step = models.IntegerField(default=0)
    # we set the custom manager
    objects = UserStepManager()

然后当用户注册时,会创建一个新的UserStep对象。

models.py

@receiver(user_signed_up)
def complete_social_signup(sender, **kwargs):
    """We start step to 0"""
    user = kwargs.pop('user')
    us = UserStep(user=user)
    us.save()

我在我的一个视图中使用管理器中定义的方法setUserStep,当用户请求/phase1/step1/ URL时,会调用该方法。因此,如果当前步骤为零,则将其设置为1.这很简单。

views.py

@login_required
def step1(request):
    context_dict = {}
    UserStep.objects.setUserStep(request.user, 0, 1)
    return render(request, 'phase1/step1.html', context_dict)

我通过注册并调用该视图手动测试了这种行为,一切都按预期工作。检查数据库时,user.userstep.step设置为1。

然后,作为一个好孩子,我决定开始编写一些测试(我还没有先写测试,我应该先编写测试来测试我的测试:P)。

tests.py

class MyTests(TestCase):

    def setUp(self):
        self.test_user = User.objects.create_user(username="test",
                                                  email="test@test.com",
                                                  password="test")
        # Mock user_signed_up signal.
        us = UserStep(user=self.test_user)
        us.save()
        self.c = Client()

    def test_step_gets_incremented(self):
        self.c.login(username="test", password="test")
        response = self.c.get('/phase1/step1/')
        # user is logged in, the test should pass
        self.assertEqual(response.status_code, 200)
        current_user_step = self.test_user.userstep.step
        # Test doesn't pass. WHY ME
        self.assertEqual(current_user_step, 1)

AND BOOM AssertionError: 0 != 1

我甚至在我的view方法中做了一个简单的打印,它应该被调用。

谢谢!

1 个答案:

答案 0 :(得分:4)

您必须从数据库重新加载test_user,因为将用户更改为另一个用户实例。这意味着:

u1 = User.objects.get(id = 1)
u2 = User.objects.get(id = 1)

u1的更改(即使已保存)也未镜像到u2。因此,您必须在请求后再次从数据库中获取用户。