Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试没有通过Django,而它应该_Python_Django_Unit Testing - Fatal编程技术网

Python 测试没有通过Django,而它应该

Python 测试没有通过Django,而它应该,python,django,unit-testing,Python,Django,Unit Testing,我刚从Django开始,我想也许有人可以告诉我一个简单的测试,我写的应该通过,但显然没有。好吧,我说应该是这样的,但作为Django的新手,我想我缺乏知识是它失败的原因 我用另一个模型和一对一的关系扩展了django用户模型,正如文档中所建议的那样,在模型中添加了一个字段。该模型,即UserStep,只包含一个从零开始的整数。我还决定扩展管理器,以实现一个名为setUserStep的方法,如果满足条件,该方法将步骤设置为一个新值 型号.py class UserStepManager(model

我刚从Django开始,我想也许有人可以告诉我一个简单的测试,我写的应该通过,但显然没有。好吧,我说应该是这样的,但作为Django的新手,我想我缺乏知识是它失败的原因

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

型号.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()
@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()
@login_required
def step1(request):
    context_dict = {}
    UserStep.objects.setUserStep(request.user, 0, 1)
    return render(request, 'phase1/step1.html', context_dict)
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)
然后,当用户注册时,将创建一个新的UserStep对象

型号.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()
@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()
@login_required
def step1(request):
    context_dict = {}
    UserStep.objects.setUserStep(request.user, 0, 1)
    return render(request, 'phase1/step1.html', context_dict)
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)
我在我的一个视图中使用管理器中定义的方法
setUserStep
,当用户请求
/phase1/step1/
URL时,会调用该方法。因此,如果当前步长为零,则将其设置为1。就这么简单

视图.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()
@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()
@login_required
def step1(request):
    context_dict = {}
    UserStep.objects.setUserStep(request.user, 0, 1)
    return render(request, 'phase1/step1.html', context_dict)
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)
我通过注册并调用该视图手动测试了该行为,所有操作都按预期进行。当我检查数据库时,
user.userstep.step
被设置为1

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

测试.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()
@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()
@login_required
def step1(request):
    context_dict = {}
    UserStep.objects.setUserStep(request.user, 0, 1)
    return render(request, 'phase1/step1.html', context_dict)
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)
和BOOM
AssertionError:0!=1

我甚至在我的view方法中做了一个简单的print,它得到了应有的调用


谢谢

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

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

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

当您使用类似于
us=UserStep.objects.get(user=self.test\u user)的东西显式地从数据库中获取用户时会发生什么;self.assertEqual(美国步骤1)
?:为什么????你说得对!它过去了!哇,我对python和django的知识的缺乏显然是问题所在。谢谢将在7分钟内接受。