如何在 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 的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中拒绝来自客户端的非 UTC/GMT 日期?

postman中对于c#中out类型参数如何传参?

测试来自 C# 的 AES-NI 指令

oracle 如何导入相同名称的表

如何使用来自客户端 C# Winforms 的 asmx 服务 (BL) 的类函数

如何在 PLSQL Developer 中测试包含 DML 的 Oracle 函数?