Return 来自 moq void 方法的数据,其操作没有参数到正在测试的功能

Return data from moq void method with action with no parameter to function being tested

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

我的新 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 是一个私有方法,它仍然调用其他 public functions/methods 也被模拟。

如果我调用上面的代码

我的 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 将按预期 return 数据,IsValid 也按预期工作。

所以 moqqing 我的新 InTransaction 为:

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

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

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

任何想法我可以如何 return 来自最小起订量无效方法的数据,该方法在被测试的函数中接受一个 Action 参数。

谢谢。

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

一个Callback可以用来抓取传递过来的action参数。从那里可以调用它

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();
    }

//...

运行 测试时应有的状态。