C# 模拟或单元测试

C# 模拟或单元测试,c#,.net-3.5,mocking,rhino-mocks,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

我有一些关于模拟和假测试类型的问题。由于我在这方面很新,我面临的问题是我有一个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中。我想测试或者我们可以说是mock db object或markdataanalysis方法,并想控制markdataanalysis方法中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();
    }
}

db
是如何声明的?它的类型是什么?db是在定义executescaler方法的同一个类中声明的,并且是在该类的构造函数中声明的。发布代码以说明如何声明它以及如何实例化它。
db
的数据类型是什么?另外,您在该类的构造函数中定义的executescaler方法是什么意思?我为文件添加了代码。但您没有显示什么是
db
,它是
FoxProDB
IDatabase
的类型?如果它是
IDatabase
,您可以模拟它。尽量避免使用静态方法,因为它们很难测试。将mock
IDatabase
实例注入
db
并测试
markdataanalysis
方法。