如何使用python中的补丁模拟python库,无论它在何处使用?

时间:2017-05-16 13:42:57

标签: python unit-testing ftp mocking magicmock

在下面的问题中,使用ftplib的函数在同一个文件中定义,这使得修补它很简单(' ftplib.FTP')

Mocking ftplib.FTP for unit testing Python code

我的问题是:如果在我的测试中,我想创建一个类的实例(让我们称之为' A')在某处使用ftplib,我该怎么办?即:A类有B类实例,B有FTP对象调用connect())?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using MySql.Data.MySqlClient;

    namespace MySqlExport
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    MySqlConnection connection = DBconnection.GetDBconnection();
                    string selectString = " select pdfFile, fullName from Employee ";
                    MySqlCommand selectCommand = new MySqlCommand(selectString, connection);
                    connection.Open();
                    MySqlDataReader reader = selectCommand.ExecuteReader();
                    reader.Read();
                    // now whats next??.........
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

如果我使用另一个问题中给出的解决方案,我发现调用了ftplib而不是mock。我怎么知道ftplib.FTP的正确路径?

1 个答案:

答案 0 :(得分:1)

在处理模拟类的导入时,重要的是文件(类所在的位置)导入lib的方式。

要制作补丁,必须知道调用lib的上下文的名称。 如果__name__为'A.B',则补丁将为:@patch('A.B.ftplib.FTP')如果B将FTP导入为import ftplib。 如果B将lib导入from ftplib import FTP,则它将是:@patch('A.B.FTP')