2015-02-10 33 views
3

我剛剛開始與Django,也許有人可以啓發我一個簡單的測試,我寫了應該通過,但顯然沒有。那麼,我說它應該,但對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() 

我用在當用戶請求/phase1/step1/ URL被調用我的意見之一經理定義的方法setUserStep。所以,如果當前步驟爲零,則將其設置爲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="[email protected]", 
                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) 

和吊杆AssertionError: 0 != 1

我甚至做在我看來方法進行簡單的打印,它被調用,因爲它應該。

謝謝!

+1

當你使用類似'us = UserStep.objects.get(user = self.test_user)的方式從數據庫中顯式獲取時會發生什麼? self.assertEqual(us.step,1)'? – dm03514 2015-02-10 19:18:40

+0

:O爲什麼?你是對的!它通過! – 2015-02-10 19:20:03

回答

4

您必須從數據庫中重新加載test_user,因爲將用戶的更改執行到另一個用戶實例。這意味着,如果:

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

變化u1(即使保存)不鏡像到u2。所以你必須在請求後再從db獲得用戶。

+1

哇我對python和django的知識缺乏顯然是個問題。謝謝!將在7分鐘內接受。 – 2015-02-10 19:21:32

+0

我不知道爲什麼我認爲這是某種單身人士.. – 2015-02-10 19:44:22

相關問題