2015-04-23 4 views
6

मुझे नहीं पता कि मुझे यह क्यों नहीं मिल रहा है, लेकिन मैं पाइथन में नकली का उपयोग करना चाहता हूं ताकि यह जांच सके कि मेरे फ़ंक्शन ftplib.FTP में फ़ंक्शंस को कॉल कर रहे हैं। मैंने सबकुछ नीचे सरलीकृत कर दिया है और अभी भी मेरे सिर को लपेट नहीं रहा है कि यह कैसे काम करता है। यहाँ एक सरल उदाहरण है:यूनिट परीक्षण के लिए ftplib.FTP मॉकिंग पायथन कोड

import unittest 
import ftplib 
from unittest.mock import patch 

def download_file(hostname, file_path, file_name): 
    ftp = ftplib.FTP(hostname) 
    ftp.login() 
    ftp.cwd(file_path) 

class TestDownloader(unittest.TestCase): 

    @patch('ftplib.FTP') 
    def test_download_file(self, mock_ftp): 
     download_file('ftp.server.local', 'pub/files', 'wanted_file.txt') 

     mock_ftp.cwd.assert_called_with('pub/files') 

जब मैं इस चलाने के लिए, मैं:

AssertionError: Expected call: cwd('pub/files') 
Not called 

मैं जानता हूँ कि यह नकली वस्तु का उपयोग कर के बाद से है कि एक नकली सर्वर नाम है होना चाहिए, और जब पैचिंग के बिना चला , यह एक "socket.gaierror" अपवाद फेंकता है।

मैं वास्तविक वस्तु को कैसे चला सकता हूं? दीर्घकालिक लक्ष्य में एक ही फ़ाइल में "download_file" फ़ंक्शन नहीं है, लेकिन इसे एक अलग मॉड्यूल फ़ाइल से कॉल करना है।

उत्तर

7

जब आप patch(ftplib.FTP) करते हैं तो आप FTP कन्स्ट्रक्टर को पैच कर रहे हैं। dowload_file()के लिए इसका इस्तेमालftp वस्तु का निर्माण तो अपने ftp वस्तु जिस पर आप login() फोन और cmd()mock_ftp.return_value बजाय mock_ftp हो जाएगा।

आपका परीक्षण कोड का पालन किया जाना चाहिए:

class TestDownloader(unittest.TestCase): 

    @patch('ftplib.FTP', autospec=True) 
    def test_download_file(self, mock_ftp_constructor): 
     mock_ftp = mock_ftp_constructor.return_value 
     download_file('ftp.server.local', 'pub/files', 'wanted_file.txt') 
     mock_ftp_constructor.assert_called_with('ftp.server.local') 
     self.assertTrue(mock_ftp.login.called) 
     mock_ftp.cwd.assert_called_with('pub/files') 

मैं सभी चेक और autospec=True जोड़ा सिर्फ इसलिए कि एक good practice

0

मैं pytest और pytest-नकली उपयोग करने का सुझाव।

from pytest_mock import mocker 


def test_download_file(mocker): 
    ftp_constructor_mock = mocker.patch('ftplib.FTP') 
    ftp_mock = ftp_constructor_mock.return_value 

    download_file('ftp.server.local', 'pub/files', 'wanted_file.txt') 

    ftp_constructor_mock.assert_called_with('ftp.server.local') 
    assert ftp_mock.login.called 
    ftp_mock.cwd.assert_called_with('pub/files') 
संबंधित मुद्दे