带有 IDbDataParameter 参数的模拟方法

Mock method with IDbDataParameter params

我正在尝试对使用某些接口依赖项的函数进行单元测试。 我想使用最小起订量模拟这个界面。界面有这样的功能:

int Command(CommandType commandType, string commandText, params IDbDataParameter[] parameters);

实现接口的'normal'class将使用IDbDataParameter参数并在其上设置一些值。这些值然后在调用接口上的命令函数的函数中使用。有谁知道我是如何设置模拟对象的,所以当在模拟对象上调用命令函数时,它将在它接收到的 IDbDataParameter 上设置值作为输入?

所以我要测试的调用 Command 函数的函数如下所示:

var pInput = DbDataParameter();
var pOutput = DbDataParameter();

Dependency.Command(Type, Name, pInput, pOutput);

if (pOutput.Value != null)
{
    Do Something
}

我试过使用下面的回调函数,但没有用。 数组变量是一个数组,其中的值设置为要测试的函数中需要的值。

Mock.Setup(o => o.Command(It.IsAny<CommandType>(), It.IsAny<string>(), It.IsAny<IDbDataParameter[]>())).
            Callback<CommandType, string, IDbDataParameter[]>((c, s, p) => p = array);

好的,我找到了我自己问题的答案。问题是你不能直接给数组赋值,所以 (p = array) 不起作用。但是,可以为数组中的值分配一个值。所以 (p[1] = array[1]) 确实起作用了。例如:

    Mock.Setup(o => o.Command(It.IsAny<CommandType>(), It.IsAny<string>(), It.IsAny<IDbDataParameter[]>())).
        Callback<CommandType, string, IDbDataParameter[]>((c, s, p) => 
        {
            for (var i = 0; i < p.Length; i++)
            {
                p[i] = array[i]);
            }
        });