C# 从moq void方法返回数据,操作不带参数,以测试函数
我最近在我的存储库中添加了一个新方法,因为我需要在事务模式下处理我的数据库调用,而且一切都很好,但是现在我正在尝试调整单元测试,我遇到了一个问题 我的新void方法(即InTransaction)接受一个C# 从moq void方法返回数据,操作不带参数,以测试函数,c#,unit-testing,moq,C#,Unit Testing,Moq,我最近在我的存储库中添加了一个新方法,因为我需要在事务模式下处理我的数据库调用,而且一切都很好,但是现在我正在尝试调整单元测试,我遇到了一个问题 我的新void方法(即InTransaction)接受一个操作作为参数,我可以将一个匿名方法传递给它: myFunction() { MyObject data1 = null; MyObject data2 = null; UnitOfWork.InTransaction(() => { d
操作
作为参数,我可以将一个匿名方法传递给它:
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函数将崩溃,因为它不接受null(顺便说一句,简化的解释!)
DoSomething是一个私有方法,它仍然调用其他也被模拟的公共函数/方法
如果我调用上面的代码
我的DoSomething方法是私有的,但他们在没有此新的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也将按预期工作
因此,莫青将我的新内测作为:
unitOfWork.Setup(uow => uow.InTransaction(It.IsAny<Action>());
unitOfWork.Setup(uow=>uow.InTransaction(It.IsAny());
moq将正确,但问题是MyFunction
函数的其余部分将失败,因为IsValid
希望将数据1和数据2设置为特定的值
我已经看过回调,但我认为它不适合于此。我在其他单元测试中使用它,但它们用于函数,而不是允许我为各种对象设置参数的void方法
我想知道如何从moqvoid方法返回数据,该方法在被测试的函数中接受一个动作参数
谢谢。需要调用该操作,以便代码按预期运行 可以使用
回调
来获取传递的操作参数。从那里可以调用它
unitOfWork
.Setup(_ => _.InTransaction(It.IsAny<Action>())
.Callback((Action action) => action()); //invoke the action within the callback
当测试运行时,它应该运行。如何\n在哪里定义了
isValid
函数?谢谢!有趣的是,我刚刚更改了代码以在回调中传递操作,我注意到我可以看到所有的私有变量都在运行。Target,但在看到您的答复之前,我不知道如何设置它们!再次感谢。现在一切正常!
//...
() => {
data1 = DoSomething(a,b,c);
data2 = DoSomething(a,b,c);
UnitOfWork.Save();
}
//...