C# 模拟或单元测试
我有一些关于模拟和假测试类型的问题。由于我在这方面很新,我面临的问题是我有一个cald MarkAnalyze方法,其语法如下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
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
,您可以模拟它。尽量避免使用静态方法,因为它们很难测试。将mockIDatabase
实例注入db
并测试markdataanalysis
方法。