2012-09-25 13 views
7

मान लीजिए कि हमारे पास मॉड्यूल की एक प्रणाली है जो केवल उत्पादन चरण पर मौजूद है। इन मॉड्यूल का परीक्षण करने के समय मौजूद नहीं है। लेकिन फिर भी मैं उन मॉड्यूल का उपयोग करने वाले कोड के लिए परीक्षण लिखना चाहता हूं। आइए यह भी मान लें कि मुझे पता है कि उन मॉड्यूल से सभी आवश्यक वस्तुओं का नकल कैसे करें। सवाल यह है: मैं आसानी से वर्तमान पदानुक्रम में मॉड्यूल स्टब्स कैसे जोड़ूं?मैं गैर-मौजूदा मॉड्यूल के पदानुक्रम का नकल कैसे करूं?

यहां एक छोटा सा उदाहरण है। मैं परीक्षण करना चाहते हैं कार्यक्षमता actual.py नामक एक फ़ाइल में रखा गया है:

actual.py: 


def coolfunc(): 
    from level1.level2.level3_1 import thing1 
    from level1.level2.level3_2 import thing2 
    do_something(thing1) 
    do_something_else(thing2) 

अपने परीक्षण सुइट में मैं पहले से ही सब कुछ मैं जरूरत है: मैं thing1_mock और thing2_mock है। इसके अलावा मेरे पास एक परीक्षण समारोह है। मुझे वर्तमान मॉड्यूल सिस्टम में level1.level2... जोड़ने की आवश्यकता है। इस तरह:

tests.py 

import sys 
import actual 

class SomeTestCase(TestCase): 
    thing1_mock = mock1() 
    thing2_mock = mock2() 

    def setUp(self): 
    sys.modules['level1'] = what should I do here? 

    @patch('level1.level2.level3_1.thing1', thing1_mock) 
    @patch('level1.level2.level3_1.thing1', thing2_mock) 
    def test_some_case(self): 
    actual.coolfunc() 

मुझे पता है कि मैं एक वस्तु किसी अन्य वस्तु और इतने पर युक्त sys.modules['level1'] स्थानापन्न कर सकते हैं। लेकिन यह मेरे लिए बहुत सारे कोड की तरह लगता है। मुझे लगता है कि बहुत सरल और सुंदर समाधान होना चाहिए। मुझे बस यह नहीं मिल रहा है।

उत्तर

9

तो, किसी ने मेरी समस्या से मेरी सहायता नहीं की और मैंने इसे स्वयं हल करने का फैसला किया। Here एक माइक्रो-lib है जिसे surrogate कहा जाता है जो किसी को गैर-मौजूदा मॉड्यूल के लिए स्टब्स बनाने की अनुमति देता है।

लिब mock इस तरह से इस्तेमाल किया जा सकता:

from surrogate import surrogate 
from mock import patch 

@surrogate('this.module.doesnt.exist') 
@patch('this.module.doesnt.exist', whatever) 
def test_something(): 
    from this.module.doesnt import exist 
    do_something() 

सबसे पहले @surrogate डेकोरेटर, गैर-मौजूद मॉड्यूल के लिए स्टब्स बनाता है, फिर @patch डेकोरेटर उन्हें बदल सकते हैं। जैसे @patch, @surrogate सजावटी "बहुवचन में" का उपयोग किया जा सकता है, इस प्रकार एक से अधिक मॉड्यूल पथ को दबाया जा सकता है। सभी स्टब्स केवल सजाए गए समारोह के जीवनकाल में मौजूद हैं।

अगर किसी को इस lib का कोई उपयोग मिलता है, तो यह बहुत अच्छा होगा :)

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