2013-03-25 33 views
16

Tôi là một người mới bắt đầu Django tương đối và chỉ mới bắt đầu thực hiện một số thử nghiệm cho các dự án của tôi. Những gì tôi muốn làm là xây dựng một thử nghiệm chức năng với selen mà đăng nhập vào trang web Admin Django.Bạn có thể tạo người dùng quản trị bằng Factory_Boy như thế nào?

Lần đầu tiên tôi làm theo hướng dẫn này http://www.tdd-django-tutorial.com/tutorial/1/ và các đồ đạc đã sử dụng và dumpdata để làm cho thông tin tài khoản quản trị có sẵn cho ứng dụng thử nghiệm (tạo cơ sở dữ liệu mới). Điều này hoạt động tốt.

Sau đó tôi muốn xem liệu tôi có thể thực hiện tương tự bằng cách sử dụng factory-boy để thay thế các đồ đạc hay không. Nhà máy cậu bé hoạt động bằng cách instantiating các đối tượng cần thiết trong file tests.py mà dường như sạch hơn với tôi. Bằng cách nào đó tôi không thể có được điều này để làm việc và các tài liệu Factory_boy không phải là quá hữu ích ...

Đây là tests.py tôi

from django.test import LiveServerTestCase 
from django.contrib.auth.models import User 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import factory 

class UserFactory(factory.Factory): 
    FACTORY_FOR = User 

    username = 'jeff' 
    password = 'pass' 
    is_superuser = True 

class AdminTest(LiveServerTestCase): 

    def setUp(self): 
     self.browser = webdriver.Firefox() 

    def tearDown(self): 
     self.browser.quit() 

    def test_if_admin_login_is_possible(self): 
     jeff = UserFactory.create() 

     # Jeff opens the browser and goes to the admin page 
     self.browser = webdriver.Firefox() 
     self.browser.get(self.live_server_url + '/admin/') 

     # Jeff sees the familiar 'Django Administration' heading 
     body = self.browser.find_element_by_tag_name('body') 
     self.assertIn('Django administration', body.text) 

     # Jeff types in his username and password and hits return 
     username_field = self.browser.find_element_by_name('username') 
     username_field.send_keys(jeff.username) 
     password_field = self.browser.find_element_by_name('password') 
     password_field.send_keys(jeff.password) 
     password_field.send_keys(Keys.RETURN) 

     # Jeff finds himself on the 'Site Administration' page 
     body = self.browser.find_element_by_tag_name('body') 
     self.assertIn('Site administration', body.text) 

     self.fail('Fail...') 

này thất bại trong việc đăng nhập như là bằng cách nào đó nó không tạo ra một tài khoản quản trị hợp lệ. Làm thế nào tôi có thể làm điều đó bằng cách sử dụng nhà máy-boy? Có thể hay tôi cần sử dụng đồ đạc cho điều đó?

(Trong bài đăng này một số người đề xuất đồ đạc là cần thiết nhưng cậu bé nhà máy đã không đưa ra: How to create admin user in django tests.py. Tôi cũng đã thử giải pháp được đề xuất ở dưới cùng trong cùng một câu trả lời: https://stackoverflow.com/a/3495219/1539688. Nó không hoạt động cho tôi .. .)

Trả lời

6

Tôi giả sử bạn đang làm việc trên hướng dẫn http://www.tdd-django-tutorial.com vì đó cũng là nơi tôi bị kẹt. Bạn có thể đã tìm ra điều này ngay bây giờ, nhưng đối với người tiếp theo, đây là mã làm việc cho tôi, thủ thuật đã thêm phương thức _prepare để đảm bảo mật khẩu được mã hóa và thiết lập tất cả các cờ thành true (Điều này đã được thực hiện với Django 1.5. 1, nếu bạn đang sử dụng một phiên bản trước đó, thay đổi mô hình nhập khẩu tài khoản)

from django.test import LiveServerTestCase 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

import factory 
from django.contrib.auth import get_user_model 
User = get_user_model() 


class UserFactory(factory.DjangoModelFactory): 
    FACTORY_FOR = User 

    email = '[email protected]' 
    username = 'admin' 
    password = 'adm1n' 

    is_superuser = True 
    is_staff = True 
    is_active = True 

    @classmethod 
    def _prepare(cls, create, **kwargs): 
     password = kwargs.pop('password', None) 
     user = super(UserFactory, cls)._prepare(create, **kwargs) 
     if password: 
      user.set_password(password) 
      if create: 
       user.save() 
     return user 

class PollsTest(LiveServerTestCase): 

    def setUp(self): 
     self.browser = webdriver.Firefox() 
     self.browser.implicitly_wait(3) 
     self.user = UserFactory.create() 


    def tearDown(self): 
     self.browser.quit() 

    def test_can_create_new_poll_via_admin_site(self): 
     self.browser.get(self.live_server_url+'/admin/') 

     body = self.browser.find_element_by_tag_name('body') 
     self.assertIn('Django administration', body.text) 

     username_field = self.browser.find_element_by_name('username') 
     username_field.send_keys(self.user.username) 

     password_field = self.browser.find_element_by_name('password') 
     password_field.send_keys('adm1n') 
     password_field.send_keys(Keys.ENTER) 

     body = self.browser.find_element_by_tag_name('body') 
     self.assertIn('Site administration', body.text) 

     polls_links = self.browser.find_element_by_link_text('Polls') 
     self.assertEqual(len(polls_links), 2) 


     self.fail('Finish the test!') 
28

Nếu bạn phân lớp factory.DjangoModelFactory nó nên lưu các đối tượng sử dụng cho bạn. Xem phần ghi chú dưới PostGenerationMethodCall. Sau đó, bạn chỉ cần làm như sau:

class UserFactory(factory.DjangoModelFactory): 
    FACTORY_FOR = User 

    email = '[email protected]' 
    username = 'admin' 
    password = factory.PostGenerationMethodCall('set_password', 'adm1n') 

    is_superuser = True 
    is_staff = True 
    is_active = True 
+0

Làm cách nào bạn có thể đặt 'Nhóm người dùng'. – Shubham

+0

Đối với những người tìm kiếm bài đăng này ngay bây giờ, 2.5.0+ giờ bỏ qua các thuộc tính 'FACTORY_ *' có lợi cho việc xác định các thuộc tính trong lớp Meta bên trong: http://factoryboy.readthedocs.io/en/latest/changelog.html#upgrading – RevolutionTech

0

Đây là cách tôi đã làm nó với Factory Boy 2.7.0Django 1.8.4. Dưới đây là hai nhà máy, một cho một người dùng cơ bản và một cho người dùng quản trị mà kế thừa từ cơ bản chỉ thêm các lĩnh vực cần thiết.

class UserFactory(DjangoModelFactory): 

    class Meta: 
     model = User 
     django_get_or_create = ('username', 'email', 'password') 

    username = 'basic' 
    email = '[email protected]_admin.com' 
    password = 'basicpassword' 


class AdminFactory(UserFactory): 
    username = 'admin' 
    is_superuser = True 
0

Tôi gặp sự cố tương tự khi tạo người dùng. Mật khẩu băm Django khi tạo người dùng và bạn lưu mật khẩu bằng DjangoFactory mà không cần băm. Ngày đăng nhập Django kiểm tra mật khẩu mà bạn gửi với một băm được lưu trữ. Trên xác minh bước này không thành công khi bạn kiểm tra không băm mật khẩu với một mật khẩu không băm. Dưới đây là một ví dụ làm thế nào tôi cố định này trong mã của tôi:

from django.contrib.auth.hashers import make_password 
from factory import DjangoModelFactory, Sequence 



class UserFactory(DjangoModelFactory): 
    class Meta: 
     model = User 
     django_get_or_create = ('username', 'password') 

    username = Sequence(lambda n: 'somename%s' % n) 
    password = Sequence(lambda p: 'mysuperpass%s' % p) 

    @classmethod 
    def _create(cls, model_class, *args, **kwargs): 
     """Override the default ``_create`` with our custom call.""" 
     kwargs['password'] = make_password(kwargs['password']) 
     return super(UserFactory, cls)._create(model_class, *args, **kwargs) 

Tôi mất mật khẩu mà được tạo ra sử dụng Sequence và băm nó sử dụng Django make_password phương pháp. Trong các thử nghiệm, bạn có thể tạo một var với giá trị không băm và tạo một người dùng với var này. Ví dụ:

password = 'test123' 
user = UserFactory(password=my_password) 
Các vấn đề liên quan