使用IDbDataParameter参数的Mock方法。

问题描述 投票:0回答:1

我正在尝试对一个使用某个接口依赖的函数进行单元测试,我想使用moq来模拟这个接口。该接口有一个这样的函数。

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

实现该接口的 "普通 "类将使用IDbDataParameter参数并设置一些值。然后在调用接口上的命令函数的函数中使用这些值。有谁知道我如何设置mock对象,以便当命令函数在mock对象上被调用时,它将在收到的IDbDataParameter上设置值作为输入?

所以,我想测试的函数和命令函数的调用是这样的。

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);
c# .net unit-testing mocking moq
1个回答
0
投票

好吧,我找到了自己问题的答案。问题是,你不能直接给数组赋值,因此 (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]);
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.