gpt4 book ai didi

c# - 从 moq void 方法返回数据,操作不带参数到被测试的函数

转载 作者:行者123 更新时间:2023-11-30 15:13:27 24 4
gpt4 key购买 nike

我最近在我的存储库中添加了一个新方法,因为我需要在事务模式下处理我的数据库调用并且一切正常,但现在我正在尝试调整单元测试,但我遇到了问题。

我的新 void 方法(即 InTransaction)接受一个 Action 作为参数,我可以将一个匿名方法传递给它:

myFunction()
{
MyObject data1 = null;
MyObject data2 = null;

UnitOfWork.InTransaction(() =>
{
data1 = DoSomething(a,b,c);
data2 = DoSomething(a,b,c);
UnitOfWork.Save();
});

var isValidData1 = IsValid(data1);
var isValidData2 = IsValid(data2);
}

我面临的问题是我仍然需要将 data1 和 data2 设置为某个值,否则我的 IsValid 函数会因为不接受空值而失效(顺便说一句,简化解释!)。

DoSomething 是一个私有(private)方法,它仍然调用其他同样被模拟的公共(public)函数/方法。

如果我调用上面的代码

我的 DoSomething 方法是私有(private)的,但他们在没有这个新的 InTransaction 方法的情况下进行调用:

myFunction()
{
MyObject data1 = null;
MyObject data2 = null;

data1 = DoSomething(a,b,c);
data2 = DoSomething(a,b,c);
UnitOfWork.Save();

var isValidData1 = IsValid(data1);
var isValidData2 = IsValid(data2);
}

我所有的模拟都按预期工作,DoSomething 将按预期返回数据,IsValid 也按预期工作。

所以 moqqing 我的新 InTransaction 为:

unitOfWork.Setup(uow => uow.InTransaction(It.IsAny<Action>());

将正确起订,但问题是 MyFunction 函数的其余部分将失败,因为 IsValid 期望将 data1 和 data2 设置为特定的值。

我看过 Callback,但我认为它不适合这个。我在其他单元测试中使用它,但这些用于函数而不是 void 方法,我可以在其中为各种对象设置参数。

关于如何从接受被测试函数内部的 Action 参数的 moq void 方法返回数据的任何想法。

谢谢。

最佳答案

将需要调用该操作,以便代码按预期运行

Callback 可用于获取传递的操作参数。从那里可以调用它

unitOfWork
.Setup(_ => _.InTransaction(It.IsAny<Action>())
.Callback((Action action) => action()); //invoke the action within the callback

这将允许

//...

() => {
data1 = DoSomething(a,b,c);
data2 = DoSomething(a,b,c);
UnitOfWork.Save();
}

//...

在执行测试时按应有的方式运行。

关于c# - 从 moq void 方法返回数据,操作不带参数到被测试的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58732928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com