如何对具有StreamReader和数据库访问权限的方法进行单元测试

时间:2017-02-22 01:32:00

标签: c# sql-server unit-testing

我以前从未做过单元测试。我想学习如何做到这一点。我想使用Visual Studio单元测试和moq。

我的项目是将数据从interbase传输到SQL Server。首先,我将interbase中的数据提取到纯文本文件中。布局是FieldName +一些空格,最多32个字符长度+字段值。然后,我编写了一个逐行读取文本文件的方法;一旦它到达下一条记录,它就会将当前记录插入SQL Server。

因此它涉及流阅读器和SQL数据库插入。对于流阅读器,我在Internet上阅读了一些帖子,并将Stream阅读器作为方法的参数传递;但是SQL Server部分,我不知道如何简化我的方法,以便可以对其进行测试。

我真的需要你的帮助。

public partial class TableTransfer
{
    #region declare vars
    public string FirstFldName = "";
    public string ErrorMsg = "";
    public List<MemoBlobTrio> MemoBlobs = null;
    public string SqlServerTableName = "";
    #endregion

    public bool DoTransfer(System.IO.StreamReader sr, Func<TransferShare, string, string, bool> TransferTable)
    {
        #region declare var
        bool DoInsert = true;
        TransferShare transferShare = null;
        string line = string.Empty;
        string blobLines = string.Empty;
        string fldName = string.Empty;
        string value = string.Empty;
        bool Is1stLine = true;
        bool isMemoFld = false;
        MemoBlobTrio memoBlobTrio = null;
        int idx = 0;
        #endregion

        try
        {
            using(sr)
            {
                transferShare = new TransferShare();
                ConnectSQLServer(transferShare);
                transferShare.StartInsert(SqlServerTableName);
                bool readNext = true;
                do
                {
                    try
                    {
                        if (readNext)
                            line = sr.ReadLine();

                        if ((line != null) && (line.Trim() != ""))
                        {
                            fldName = line.Length > 30 ? line.Substring(0, 31).TrimEnd() : "";

                            Is1stLine = fldName == FirstFldName;
                            if (Is1stLine)
                            {
                                if (DoInsert)
                                    EndInsert(transferShare, line);
                                else
                                    transferShare.ClearSQL();
                                DoInsert = true;
                            }

                            idx = 0;
                            isMemoFld = false;
                            while (idx < MemoBlobs.Count)
                            {
                                if (fldName == (MemoBlobs[idx] as MemoBlobTrio).fbFldName)
                                {
                                    memoBlobTrio = MemoBlobs[idx] as MemoBlobTrio;
                                    line = InsertMemoBlob(transferShare, sr, memoBlobTrio.ssFldName, fldName, memoBlobTrio.fbNextFldName);
                                    readNext = false;
                                    isMemoFld = true;
                                }
                                idx++;
                            }

                            if (!isMemoFld)
                            {
                                if (line.Length > 31)
                                    value = line.Remove(0, 31);
                                else
                                    value = "";
                                if (!TransferTable(transferShare, fldName, value))
                                    DoInsert = false;
                                readNext = true;
                            }
                        }
                    }
                    catch (Exception err)
                    {
                        HandleError(err, line);
                    }

                } while (line != null);
                if (DoInsert)
                    EndInsert(transferShare, line);
            }
        }
        finally
        {
            transferShare.SQLConn.Dispose();
        }
        return true;
    }

    private static void ConnectSQLServer(TransferShare transferShare)
    {
        TransferShare.SQLServerConnStr = "Data Source=" + Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=MyDB;Integrated Security=True";
        transferShare.SQLConn.ConnectionString = TransferShare.SQLServerConnStr;
        transferShare.SQLConn.Open();
    }
}

public class TransferShare
{
    public void StartInsert(string TableName)
    {
        tableName = TableName;
    }

    public void EndInsert(TransferShare transferShare, string line)
    {
        SqlCommand Cmd = null;
        try
        {
            sqlInsFld = sqlInsFld.Remove(sqlInsFld.Length - 1);
            sqlInsValue = sqlInsValue.Remove(sqlInsValue.Length - 1);
            sqlInsFld = "Insert into " + tableName + " (" + sqlInsFld + ")";
            sqlInsValue = " Values (" + sqlInsValue + ")";

            Cmd = new SqlCommand(sqlInsFld + sqlInsValue, SQLConn);
            Cmd.ExecuteNonQuery();
        }
        catch (Exception err)
        {
            throw (new Exception(err.Message));
        }
        finally
        {
            sqlInsFld = "";
            sqlInsValue = "";
        }

    }
}

0 个答案:

没有答案