如何在 C# 中测试来自 Oracle 的参数
Posted
技术标签:
【中文标题】如何在 C# 中测试来自 Oracle 的参数【英文标题】:how to test out parameter from Oracle in C# 【发布时间】:2014-07-03 09:55:20 【问题描述】:我编写了一个从数据库中检索一些数据的函数(使用存储过程,Oracle 数据库)。
存储过程有4个参数,其中一个是am out参数。这是我的代码:
string commandName = "someStoredProc";
List<IDataParameter> parameters = new List<IDataParameter>() new SqlParameter("@param1", param1), new SqlParameter("@param2", param2), new SqlParameter("@param3", param3) ;
SqlParameter calcId = new SqlParameter("@param4", SqlDbType.BigInt);
calcId.Direction = ParameterDirection.Output;
parameters.Add(calcId);
Dictionary<long, ITrade> trades = _genericDataReader.ExecuteSqlQuery(parameters, CommandTypeEnum.Command, commandName);
long CalculationID = (long)calcId.Value;
此代码运行良好。
现在我正在为此编写单元测试用例。我可以随意模拟数据库结果,但不能模拟第四个输出参数:
尝试将 calcId.Value 转换为 long 时测试失败。
如何模拟这个参数值?
【问题讨论】:
【参考方案1】:这里真正需要的是编写一个 ExecuteSqlQuery
的实现以用于测试目的,它可以访问参数并且可以完成这项工作。
Rhino Mock 提供了一些方法来为 mocks/stubs 添加自定义行为。一种可能的方法是写The Do() handler。
这是一个简短的例子:
_genericDataReader
.Stub(gdr => gdr.ExecuteSqlQuery(Arg<List<IDataParameter>>.Is.Anything, Arg<CommandTypeEnum>.Is.Anything, Arg<string>.Is.Anything))
.Do((Func<List<IDataParameter>, CommandTypeEnum, string, IDictionary<long, ITrade>>)((param, cmd, cmdName) =>
param[3].Value = 12L;
return null; // or return whatever is required dataset here
));
【讨论】:
以上是关于如何在 C# 中测试来自 Oracle 的参数的主要内容,如果未能解决你的问题,请参考以下文章