2012-04-12 8 views
5

का उपयोग करके फ़ंक्शन को पैच करना मेरे पास एक टेस्ट सूट (नाक का उपयोग करके, अनजान नहीं है) है, और मैं टेस्ट क्लास में प्रत्येक टेस्ट के लिए मानों के विशिष्ट अनुक्रम को वापस करने के लिए फ़ंक्शन पैच करना चाहता हूं। मेरा पहला प्रयास, एक सरल उदाहरण का उपयोग करते हुए, था:मॉक

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

हालांकि, MagicMock उदाहरण केवल एक बार, तो दूसरे टेस्ट में विफल रहता है जब दुष्प्रभाव रन आउट बनाई गई है। मैं प्रत्येक टेस्ट विधि को अलग से पैच कर सकता हूं, लेकिन मैं वास्तव में उन सभी पर पैच सजावट को डुप्लिकेट नहीं करना चाहता हूं (इस उदाहरण की तुलना में बहुत अधिक परीक्षण हैं!) जिस तरह से मैं इसे कर सकता हूं वह पैच बनाना है इस तरह सेटअप कोड:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

लेकिन बचत और बहाल मूल कार्य परिभाषा कुछ है कि नकली स्वचालित रूप से ऐसा करने में सक्षम होना चाहिए की तरह लगता है। क्या ऐसा करने का कोई और तरीका है कि मुझे याद आ रही है? या मेरा आखिरी उदाहरण यह करने का सबसे अच्छा तरीका है?

उत्तर

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

आउट: 1

x() 

आउट: 2

एक की सूची में अपने जवाब रखो। अपने वांछित नाम के लिए एक्स बदलें।

+0

मुझे पता नहीं क्या तुम यहाँ पर हो रही है है। ऐसा लगता है कि यह सवाल बिल्कुल संबंधित नहीं है, और 'x = [1, 2] .__ iter __() लिखने का एक जटिल तरीका दिखता है। अगला'। तुम क्या कहना चाहते हो? – aquavitae

+0

अच्छी तरह से। आप एक समारोह के एक नकली क्रीम बनाने के लिए एक रास्ता चाहते हैं। अब आप reponses के आदेश rhe। नहीं? x = ["आपका पहला प्रतिक्रिया", "आपका दूसरा प्रतिक्रिया", "... आदि"] .__ iter __()। अगला समस्या हल करता है। – Nasgar

+0

मुझे पता है कि एक इटरेटर कैसे बनाएं और फ़ंक्शन का मज़ाक उड़ाएं। मेरा सवाल यह था कि प्रत्येक परीक्षण समारोह के लिए नकली को रीसेट करने का एक आसान तरीका है या नहीं। – aquavitae

1

तुम बस, हर परीक्षण में पैच लागू करना चाहिए बजाय वर्ग के लिए इसे लागू करने की:

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

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

  • कोई संबंधित समस्या नहीं^_^