2012-04-11 20 views
4

私は最終的に私のアプリケーションのテストを行うことにしましたが、ユーザーが別のユーザーを変更できるかどうかテストしませんでした。ここで私が持っているコードがさえ許可を追加した後、私のユーザーはまだ権限を持っていない、これまではdjangoでunittestの間にユーザー権限を変更できません

class RulesAndPermissionsTests(TestCase): 
    fixtures = ['auth_no_permissions.json', 'profiles.json', 'rules.json'] 

    def setUp(self): 
     self.c = Client() 
     self.user = User.objects.get(username="estagiario") 
     self.non_staff = User.objects.get(username="fisica") 
     self.admin = User.objects.get(username="admin") 
     login = self.c.login(username='estagiario', password='estagiario') 

    def test_can_change_non_staff_users(self): 
     self.assertFalse(self.user.has_perm('logical_change_user', self.non_staff.profile)) # can't change non staff users without permission 

     # now add the permission and test it again 
     self.user.user_permissions.add(Permission.objects.get(codename='change_user')) 
     print self.user.get_all_permissions() # prints set([]) 
     self.assertTrue(self.user.has_perm('logical_change_user', self.non_staff.profile)) 

)論理的な権限チェックを行うことができるようにジャンゴ・ルールを使用しますが、これは重要ではありません。これはテスト中に何も作成できないためです(これは悪い習慣ですか?)または、djangoは何らかの形でパーミッションをキャッシュしていますか? setUpでパーミッションを追加すると動作しますが、同じテスト(パーミッションの有無にかかわらずテスト)中に変更したかったのです。

ありがとうございます!

答えて

13

ModelBackendのソースコードを見ると、Djangoがユーザーオブジェクトに対するアクセス許可をキャッシュしていることがわかります。

キャッシュを消去することはできますが、キャッシュメカニズムが将来変更されると、テストが中断される可能性があります。一番簡単なことは、テストでデータベースからユーザーを再取得することです。

def test_can_change_non_staff_users(self): 
    self.assertFalse(self.user.has_perm('logical_change_user', self.non_staff.profile)) # can't change non staff users without permission 

    # now add the permission and test it again 
    self.user.user_permissions.add(Permission.objects.get(codename='change_user')) 

    # refetch user from the database 
    self.user = User.objects.get(pk=self.user.pk) 
    print self.user.get_all_permissions() # should now include new permission 
    self.assertTrue(self.user.has_perm('logical_change_user', self.non_staff.profile)) 
+0

多くの感謝!愚かな私は、私はユーザーをreloggingしようとしたが、ユーザーを再取得しようとしなかった。テストケース中にパーミッションを追加するのは悪い習慣ですか?ありがとう! – Clash

+0

テストケースの間に許可を加えてもいいと思いますが、それは悪い習慣ではないと思います。 – Alasdair

関連する問題