【问题标题】:Mock method with IDbDataParameter params带有 IDbDataParameter 参数的模拟方法
【发布时间】:2020-04-23 06:54:23
【问题描述】:

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

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

实现接口的“普通”类将使用 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);

【问题讨论】:

  • 如果你在模拟实现 Command 方法的类,那么你的 Command 方法实现就消失了。它将作为间谍工作,因此只能验证调用(时间、参数)。没有这样的逻辑可以修改 IDbParameter[]。你想测试什么?
  • 我知道,但该函数也使用“正常”函数在参数中设置的值。所以为了测试这个功能,我需要模拟来设置这些值。
  • 那么这是一个重复的主题:stackoverflow.com/questions/38147221/…
  • 好的,所以我用设置模拟的方式编辑了我的问题。这就是您发布的问题中的完成方式。它仍然没有在我正在测试的函数中提供具有设定值的数组。莫非是Setup函数不对,所以没有调用回调?
  • 这个设置对我来说似乎是正确的。您也可以尝试以下方法:Mock .Setup(o =&gt; o.Command(It.IsAny&lt;CommandType&gt;(), It.IsAny&lt;string&gt;(), It.IsAny&lt;IDbDataParameter[]&gt;())) .Returns((CommandType type, string text, params IDbDataParameter[] parameters) =&gt; { parameters= expectedParameters; return 0;});

标签: c# .net unit-testing mocking moq


【解决方案1】:

好的,我找到了自己问题的答案。问题是您不能直接为数组赋值,所以(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]);
            }
        });

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多