2010-04-14 26 views
5

Tôi đang viết các kiểm tra chức năng chi tiết cho quan điểm của mình để bổ sung cho các bài kiểm tra đơn vị trên các mô hình của tôi. Đó là một dự án Django và tôi đang sử dụng được xây dựng trong khung kiểm tra Django với unittest. Rõ ràng, một trong những điều quan trọng để kiểm tra trong các bài kiểm tra chức năng này là các điều khoản được thiết lập chính xác. Với ý nghĩ đó, tôi đang cố gắng một cái gì đó như thế này:Phát hiện lỗi quyền trong kiểm tra django

anonclient = Client() 
userclient = Client() 
userclient.login(username='test_user', password='test') 
adminclient = Client() 
adminclient.login(username='test_admin', password='test') 

path = "/path/to/my/page" 
anonresponse = anonclient.get(path) 
userresponse = userclient.get(path) 
adminresponse = adminclient.get(path) 

tôi cần để có thể khẳng định rằng anonclient và userclient đều đã từ chối cho phép trong khi adminclient làm việc một cách chính xác. Howerver, tôi không thể tìm cách kiểm tra điều này đã xảy ra mạnh mẽ! Lúc đầu, tôi quyết định kiểm tra phản hồi là chuyển hướng 302 (vì tác dụng phụ của việc không kiểm tra quyền được chuyển hướng) nhưng điều này có nghĩa là không thể nói sự khác biệt giữa chức năng tự động chuyển hướng người dùng và kiểm tra quyền không thành công. (Tôi không thể chỉ sử dụng self.assertRedirects (phản hồi, url) vì url mục tiêu có thể được ghi đè thông qua tham số login_url của permission_required trong chế độ xem!)

Có lẽ tôi nên xem xét việc mở rộng user_passes_test decorator để nó thêm một thuộc tính cho đối tượng phản hồi nếu thử nghiệm không thành công? Điều này sau đó có thể được kiểm tra trong các bài kiểm tra. Thất bại rằng tôi sẽ phải xác định xem yêu cầu đã thành công hay chưa bằng cách kiểm tra xem các tác dụng phụ của yêu cầu có xảy ra hay không. Làm theo cách này sẽ hoạt động, nhưng nó sẽ rất dài, đặc biệt là với rất nhiều kiểm tra đang được thực hiện.

Tôi không thể tưởng tượng mình là người đầu tiên gặp phải vấn đề này, cách tốt nhất để giải quyết vấn đề này là gì, hoặc tôi đã bỏ lỡ điều gì?

Cảm ơn rất nhiều!

Trả lời

1

Máy khách thử nghiệm django trả về một boolean khi bạn gọi phương thức đăng nhập, cho bạn biết liệu đăng nhập đã thành công hay chưa.

[17] >>> from django.test import Client 
[18] >>> c = Client() 
[19] >>> c.login(username='superuser', password='bar') 
[19] : False 
[20] >>> c.login(username='superuser', password='correct_password') 
[20] : True 
+0

Cảm ơn Justin, nhưng bạn đã hiểu nhầm câu hỏi của tôi - Tôi cần kiểm tra xem việc nhận sau có thành công hay không nếu xảy ra lỗi quyền (với kết quả chuyển hướng). Thông tin đăng nhập hoạt động tốt - Tôi cần có khả năng kiểm tra xem kiểm tra quyền có đang hoạt động trên chế độ xem Django hay không. – adamnfish

+0

Bạn sẽ có thể kiểm tra xem url kết quả là url bạn đã cố truy cập hay chưa. my_url = '/ foo /' resp = c.get (my_url) Sau đó, bạn có thể kiểm tra đối tượng '' resp'' cho những thứ liên quan đến trang kết quả của bạn. docs.djangoproject.com/en/dev/topics/testing/# testing-responses Cụ thể, mã trạng thái, kiểm tra xem mẫu chính xác đã được sử dụng chưa, vv Hy vọng sẽ hữu ích! –

+0

Như tôi đã nói mặc dù, tôi muốn có thể nói sự khác biệt giữa một chế độ xem phục vụ chuyển hướng và chế độ xem được chuyển hướng bởi người dùng không thực hiện kiểm tra. Tôi biết rằng tôi có thể kiểm tra các hiệu ứng phụ hoặc đánh hơi trang kết quả (thực sự, đây là những gì tôi đang làm bây giờ) nhưng tôi đã tự hỏi liệu có cách nào phát hiện ra rằng người dùng đã thất bại trong một thử nghiệm và chế độ xem không chạy, trực tiếp. Có vẻ như không có bây giờ vì vậy tôi đoán tôi sẽ gửi yêu cầu tính năng sau bản phát hành 1.2 hoặc cuộn bản thân trang trình bày đã được vá lỗi user_passes_test. – adamnfish

1

Các permission_required trang trí và PermissionRequiredMixin có một tham số raise_exception.

Một cách tốt để đối phó với nó là phải có một cái gì đó giống như một tùy chọn PERMISSIONS_RAISE_EXCEPTION=True config trong bạn settings_test.py (nếu bạn đang sử dụng một thiết lập riêng cho chạy thử nghiệm và có

from django.conf import settings 

@permission_required('<perm>', 
        raise_exception=settings.PERMISSIONS_RAISE_EXCEPTION) 
def your_view(...) 
    pass 

class YourView(PermissionRequired): 
    raise_exception = settings.PERMISSIONS_RAISE_EXCEPTION 

Bằng cách này bạn có thể sau đó bắt ngoại lệ/thử nghiệm cho 403 trong các thử nghiệm của bạn và giữ lại chuyển hướng đến trang đăng nhập.

client.login('user', 'blah') 
response = client.get('/yourview') 
assertNot(403, response.status_code) 

Thêm các thiết lập cho tất cả các permission_required trang trí của bạn có thể không phải để khẩu vị của bạn, nó cảm thấy hơi như thêm mã thử nghiệm vào nguồn của bạn, nhưng đó là cách duy nhất tôi đã thấy cho đến nay.

Các vấn đề liên quan