2013-03-04 12 views
15

नहीं मिल रहा है मैं निम्नलिखित परियोजना संरचनाDjango py.test सेटिंग्स मॉड्यूल

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

मेरे pytest.ini इस तरह दिखता है:

[pytest] 
#DJANGO_SETTINGS_MODULE =base.settings.settings 

मेरे test_module.py इस तरह दिखता है:

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

जब मैं अब चलाता हूं:

py.test 

यह बिना किसी समस्या के आयात चलाएगा और assert 3==5 (अपेक्षित के रूप में) में एक त्रुटि उठाएगा। यह मुझे बताता है कि आधार sys.path पर है और base.settings.settings आयात किया जा सकता है।

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 

जब मैं अब चलाएँ::

अब मैं test_module.py करने के लिए बदल

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

मैं त्रुटि मिलती है:

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

ही प्रभाव है जब मैं सेट नहीं करते कमांड लाइन के माध्यम से सेटिंग्स, लेकिन pytest.ini फ़ाइल (लाइन को असम्बद्ध करके) के माध्यम से।

ऐसा लगता है कि मुझे यहां कुछ याद आ रहा है ???

उत्तर

19

क्योंकि django.conf.settings आलसी है यह सेटिंग्स मॉड्यूल आयात करने के लिए केवल जब आप का उपयोग करने की कोशिश करने का प्रयास करेंगे यह। यही कारण है कि जब आप बस सेटिंग ऑब्जेक्ट आयात करते हैं तो आपका परीक्षण विफल नहीं होता है।

आपकी समस्या पहले से ही यहाँ चर्चा की है: https://github.com/pelme/pytest_django/issues/23

यह pytest के साथ कोई समस्या नहीं है और अपने आप में pytest-django के साथ है। किसी कारण से Pytest sys.path से वर्तमान निर्देशिका को हटा देता है। इसे चारों ओर काम करना आसान होना चाहिए।

समाधान 1:

PYTHONPATH=`pwd` py.test 

समाधान 2:

अपने conftest.py में जोड़ने (मैं मान लिया है कि conftest.py एक ही निर्देशिका में है आपकी ऐप्लिकेशन हैं):

import os 
import sys 

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

समाधान 3 (यदि आप वर्चुअलनेव रैपर का उपयोग कर रहे हैं):

जब आप एक नई परियोजना सिर्फ अपने प्रोजेक्ट की निर्देशिका में इस लाइन को क्रियान्वित करने द्वारा virtualenv के PYTHONPATH करने के लिए परियोजना के रूट निर्देशिका जोड़ने शुरू:

add2virtualenv . 
+4

py.test sys.path से वर्तमान निर्देशिका को नहीं हटाता है, यह पाइथन का व्यवहार है: जब एक स्क्रिप्ट निष्पादित करते हैं (इस मामले में py.test) स्क्रिप्ट की निर्देशिका sys.path में जोड़ दी जाती है। इंटरैक्टिव रूप से निष्पादित करते समय वर्तमान कार्यशील निर्देशिका sys.path में जोड़ दी जाती है। – flub

0

From the docs, ऐसा लगता है कि base अपने रास्ते में पहले से ही है - तो हो सकता है आप

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

बस कोशिश की, कुछ भी नहीं बदलता – schacki

1
अपनी सेटिंग में

क्यों 3 "टी" कर रहे हैं के उपयोग किया करना चाहते हैं? यह सेटिंग्स के विपरीत सेटिंग्स होना चाहिए

+1

इस प्रकार को पकड़ने के लिए धन्यवाद। लेकिन दुर्भाग्य से, यह मूल कारण नहीं था। – schacki

0

आप --ds=base.settings.settings तर्क के बिना दूसरा प्रोग्राम चलाते हैं और पहले नहीं। यह वह जगह है जहां से त्रुटि आ रही है।

इसके अलावा जब एक ही नाम settings के कोड का आयात मैं की तरह कुछ करने के लिए परीक्षा होगी:

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

मैंने आपकी दूसरी सिफारिश शामिल की है। लेकिन मैं आपकी पहली टिप्पणी नहीं समझता? – schacki

+0

प्रश्न में आप कहते हैं, "जब मैं अब चलाता हूं: 'py.test'" लेकिन फिर दूसरी बार जब आप कहते हैं, "जब मैं अब चलाता हूं:' py.test --ds = base.settings.settings'"। क्या यह एक टाइपो है? यदि नहीं तो डीएस ध्वज आपकी समस्या का कारण बन सकता है – Awalias

+0

नहीं, यह एक टाइपो नहीं है, लेकिन वास्तव में मैं जो दिखाना चाहता था। मुझे अपनी सेटिंग्स को कुछ निर्दिष्ट करने की आवश्यकता है और इस उदाहरण के लिए, मैंने डीएस ध्वज का चयन किया है। और जैसे ही मैं इसे सेट करता हूं, मुझे त्रुटि संदेश मिलता है। पहले उदाहरण में, मैं केवल यह दिखाना चाहता हूं कि मेरी सेटिंग्स पाइथन पथ के माध्यम से पहुंच योग्य हैं। तो एक तरफ, मेरी सेटिंग्स पाइथन पथ पर हैं। लेकिन दूसरी ओर, जैसे ही मैं उन्हें निर्दिष्ट करता हूं, वे नहीं मिल सकते हैं? – schacki

0

मैं एक ही मुद्दा था। pytest -s <project_dir> मेरे लिए ठीक काम करता है।

संबंधित मुद्दे