【发布时间】: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 => o.Command(It.IsAny<CommandType>(), It.IsAny<string>(), It.IsAny<IDbDataParameter[]>())) .Returns((CommandType type, string text, params IDbDataParameter[] parameters) => { parameters= expectedParameters; return 0;});
标签: c# .net unit-testing mocking moq