2013-03-04 30 views
15

tôi làm có cấu trúc dự án sauDjango py.test không tìm các cài đặt mô-đun

base 
    __init.py 
    settings 
     __init__.py 
     settings.py 
    tests 
     pytest.ini 
     test_module.py 

My pytest.ini trông như thế này:

[pytest] 
#DJANGO_SETTINGS_MODULE =base.settings.settings 

My test_module.py trông như thế này:

def test_django(): 
    from base.settings import settings as base_settings 
    from django.conf import settings as django_settings 
    assert 3==5 

Khi tôi chạy bây giờ:

py.test 

nó sẽ chạy hàng nhập không có vấn đề và sẽ gây ra lỗi tại assert 3==5 (như mong đợi). Điều này cho tôi biết rằng cơ sở nằm trên sys.path và có thể nhập base.settings.settings.

Bây giờ tôi thay đổi test_module.py tới:

def test_django(): 
    from base.settings import settings as base_settings 
    from django.conf import settings as django_settings 
    print django_settings.xxx 
    assert 3==5 

Khi tôi bây giờ chạy:

py.test --ds=base.settings.settings 

tôi nhận được lỗi:

ERROR: Could not import settings 'base.settings.settings' (Is it on sys.path?): No module named base.settings.settings.

Hiệu ứng tương tự khi tôi không thiết lập cài đặt thông qua dòng lệnh, nhưng thông qua tệp pytest.ini (bằng cách bỏ ghi chú dòng).

Dường như tôi bỏ lỡ điều gì đó ở đây ???

Trả lời

19

Vì django.conf.settings là lười biếng nó sẽ cố gắng để nhập khẩu các thiết lập mô-đun chỉ khi bạn cố gắng truy cập nó. Đó là lý do tại sao thử nghiệm của bạn không thành công khi bạn chỉ cần nhập đối tượng cài đặt.

Vấn đề của bạn đã được thảo luận ở đây: https://github.com/pelme/pytest_django/issues/23

Đây là một vấn đề với pytest và không phải với pytest-django chính nó. Pytest vì lý do nào đó loại bỏ thư mục hiện tại khỏi sys.path. Nó sẽ được dễ dàng để làm việc xung quanh nó.

Giải pháp 1:

PYTHONPATH=`pwd` py.test 

Giải pháp 2:

thêm video này vào conftest.py của bạn (tôi cho rằng conftest.py đó là trong cùng thư mục ứng dụng của bạn đang có):

import os 
import sys 

sys.path.append(os.path.dirname(__file__)) 

Giải pháp 3 (nếu bạn đang sử dụng trình bao bọc virtualenv):

Khi bạn bắt đầu một dự án mới chỉ cần thêm thư mục gốc của dự án để PYTHONPATH virtualenv bằng thực hiện dòng này trong thư mục của dự án của bạn:

add2virtualenv . 
+4

py.test không loại bỏ thư mục hiện tại khỏi sys.path, đây là hành vi của python: khi thực hiện một kịch bản (py.test trong trường hợp này) thư mục của tập lệnh được thêm vào sys.path. Khi thực thi tương tác, thư mục làm việc hiện tại được thêm vào sys.path. – flub

0

From the docs, có vẻ như base là đã có trong đường dẫn của bạn - vì vậy có thể bạn muốn sử dụng

py.test --ds=settings.settings 
+0

Chỉ cần thử nó, không thay đổi bất cứ điều gì – schacki

1

Tại sao lại có 3 "t" 's trong cài đặt của bạn? phải là cài đặt thay vì cài đặt

+1

Cảm ơn bạn đã bắt loại. Nhưng thật không may, đây không phải là nguyên nhân gốc rễ. – schacki

0

Bạn chạy chương trình thứ hai mà không có đối số --ds=base.settings.settings và không phải là đối số đầu tiên. Đây là nơi lỗi xuất hiện.

Ngoài ra khi nhập mã của cùng tên settings tôi sẽ bị cám dỗ để làm một cái gì đó như:

from base.settings import settings as foo 
from django.conf import settings as bar 
+0

Tôi đã kết hợp đề xuất thứ hai của bạn. Nhưng tôi không hiểu bình luận đầu tiên của bạn? – schacki

+0

trong câu hỏi bạn nói "khi tôi chạy:' py.test' "nhưng sau đó lần thứ hai bạn nói" Khi tôi chạy: 'py.test --ds = base.settings.settings'". Đây có phải là lỗi đánh máy không? Nếu không thì cờ ds có thể gây ra vấn đề của bạn – Awalias

+0

Không có điều này không phải là lỗi đánh máy, nhưng chính xác thì tôi muốn hiển thị. Tôi cần phải xác định các thiết lập của tôi một cách nào đó và ví dụ này, tôi đã chọn cờ ds. Và ngay sau khi tôi thiết lập điều này, tôi nhận được thông báo lỗi. Trong ví dụ đầu tiên, tôi chỉ muốn chứng minh rằng các thiết lập của tôi có thể truy cập thông qua đường dẫn python. Vì vậy, một mặt, cài đặt của tôi nằm trên đường dẫn python. Nhưng mặt khác, ngay sau khi tôi chỉ định chúng, chúng không thể được tìm thấy? – schacki

0

tôi đã cùng một vấn đề. pytest -s <project_dir> hoạt động tốt cho tôi.

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