2010-12-10 16 views
5

Đây chỉ là một lý thuyết mà tôi muốn tìm ra dựa trên phản hồi của những người khác và có lẽ những trải nghiệm tương tự.Django kiểm tra SQLite oddity: con đường khác nhau của thực hiện?

Đã sử dụng mySQL để chạy thử nghiệm, nhưng tất nhiên cơ sở dữ liệu SQLite trong bộ nhớ nhanh hơn nhiều. Tuy nhiên, có vẻ như đã gặp phải một số vấn đề.

Khi DATABASE_ENGINE được thiết lập để sử dụng django.db.backends.sqlite3 và tôi chạy manage.py test, đầu ra không được như kỳ vọng:

(hầu hết các dòng Removed, nhưng chỉ ra điểm thú vị của thất bại)

 
$ python manage.py test 
Traceback (most recent call last): 
    File "manage.py", line 12, in 
    execute_manager(settings) 
    File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in 
    class AcvTripIncentive(models.Model): 

    # First interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive 
    trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) 

    # Next interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in 
    current_site = Site.objects.get_current() 

Có nhiều thất bại như thế này nhưng chỉ ra một cặp vợ chồng. Vấn đề là hiển nhiên. Mô hình trang web không có dữ liệu thực tế, nhưng các tệp chứa mã cố gắng tìm nạp các cá thể hiện tại hoặc cụ thể trong mô hình Site.

Bây giờ, tôi có thể nghĩ ra một giải pháp dễ dàng: Điều đó OneToOneField nên được chuyển sang sử dụng một hàm với limit_choices_to và thứ hai giống nhau. Các chức năng này sau đó được gọi khi được yêu cầu, không phải trên quét ban đầu của tập tin bởi Django.

Tuy nhiên, câu hỏi thực tế của tôi là: Tại sao điều này xảy ra với SQLite chứ không phải mySQL?. Có cách nào khác nhau để hai bộ máy cơ sở dữ liệu xử lý thông qua các thử nghiệm không? Tôi sẽ không nghĩ như vậy, kể từ khi Python đang làm tất cả các biên dịch của các mô hình.

Chính xác điều gì đang xảy ra ở đây?

Chúc mừng.

+0

Bạn có nghĩ rằng cơ sở dữ liệu sqlite được tạo mới và trống mỗi khi bạn chạy thử nghiệm, trong khi cơ sở dữ liệu mysql có thể giống với bạn sử dụng cho sản xuất/phát triển và đã có thêm một số dữ liệu trong đó? –

+0

Cơ sở dữ liệu mySQL cũng được tạo mới mỗi lần. – Bartek

+0

Nơi nào bạn gọi Site.objects.get_current() trong mô hình của bạn? Là nó trong phương thức save() hoặc trong một tín hiệu? –

Trả lời

0

Bạn đang tải đối tượng Trang web của mình từ vật cố?

Nếu có, có thể bạn đang gặp phải vấn đề đã biết với MySQL và giao dịch. Thực hiện tìm kiếm văn bản cho "MySQL và Đồ đạc" trên trang này: http://docs.djangoproject.com/en/dev/ref/django-admin/?from=olddocs

+0

Không sử dụng đồ đạc cho đối tượng Trang web và sự cố vẫn tồn tại với SQLite :( – Bartek

1

Có một số lý do khiến bạn không phải là mocking truy cập vào cơ sở dữ liệu không? Đường ranh giới UT của bạn cực kỳ rộng khi bạn thêm cơ sở dữ liệu (bất kể cơ sở dữ liệu nào) vào hỗn hợp. Nó bắt đầu trông giống như một bài kiểm tra tích hợp hơn là một bài kiểm tra đơn vị.

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