模拟或单元测试

时间:2015-01-23 08:48:49

标签: c# .net-3.5 mocking rhino-mocks

我对模拟和伪造的测试类型有一些疑问。由于我在这个领域非常新,我遇到的问题是我有一个方法cald MarkAnalyze,其语法如下。

public static void MarkDataAnalyzed()
{
      object uniqueId = db.ExecuteScaler("SELECT MAX(SUBSTR(UniqueID,3)) FROM History where year(date) = year(date())");
      string maxUniqueID = uniqueId == null ? "0" :  uniqueId.ToString();
      Utilities.UpdateConfig(Constants.CONFIG_LAST_UNIQUE_ID, maxUniqueID);
      Utilities.Log("Data will now be analyzed beyond Unique ID: " + maxUniqueID, LogType.Information);
}

现在,如果你看到这个方法,那么我正在使用db.ExecuteScaler方法并将查询作为参数传递(我不确定它是否正确的编码方式。)我不想改变方法代码。实际上这段代码是单独的dll。我想测试或者我们可以说模拟db对象或MarkDataAnalyze方法,并希望在MarkDataAnalyzed方法中控制ExecuteScaler方法的返回值。就像我想测试MarkDataAnalyzed方法的行为一样,当ExecuteScaler返回单个值,null或任何其他东西时它的行为。

这是我的问题。我不知道我能否以正确的方式表达我的问题,但相信我,我努力在这些陈述中表达它,以便你的专家能够理解它。

我还使用.NET Framework 3.5和C#语言作为编程工具和Visual Studio 2013编辑器。因此,如果您建议使用任何库,则应该与这些框架兼容。

FoxProDb.cs文件的代码。

public class FoxProDB : IDatabase
{
    OdbcConnection conn = null;

    public FoxProDB()
    {            
        string InstallPath = GetInstallPath();
        conn = new OdbcConnection(@"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + InstallPath + ";");
    }

    public OdbcDataReader ExecuteReader(string sqlQuery)
    {
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        using (OdbcCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = sqlQuery;

                OdbcDataReader reader = cmd.ExecuteReader();
                return reader;
            }
    }

    public object ExecuteScaler(string sqlQuery)
    {
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        using (OdbcCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = sqlQuery;

                object returnVal = cmd.ExecuteScalar();
                return returnVal;
            }
    }

    public int ExecuteNonQuery(string sqlQuery)
    {
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        using (OdbcCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = sqlQuery;
            int rowsModified = cmd.ExecuteNonQuery();
            return rowsModified;
        }
    }

    public void Close()
    {
        try { 
            conn.Close(); 
        }
        catch{
            //do nothing
        }
    }

    private string GetInstallPath()
    {
        if (String.IsNullOrEmpty(installPath))
        {
            throw new Exception("");
        }

        return installPath;
    }

    public void Open()
    {
        //Need to implement it latter.
        throw new NotImplementedException();
    }

    DataTable IDatabase.ExecuteReader(string sqlQuery)
    {
        //Could be modified latter.
        throw new NotImplementedException();
    }

    string IDatabase.ExecuteScaler(string sqlQuery)
    {
        //Could be modified latter.
        throw new NotImplementedException();
    }
}

0 个答案:

没有答案