Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从moq void方法返回数据,操作不带参数,以测试函数_C#_Unit Testing_Moq - Fatal编程技术网

C# 从moq void方法返回数据,操作不带参数,以测试函数

C# 从moq void方法返回数据,操作不带参数,以测试函数,c#,unit-testing,moq,C#,Unit Testing,Moq,我最近在我的存储库中添加了一个新方法,因为我需要在事务模式下处理我的数据库调用,而且一切都很好,但是现在我正在尝试调整单元测试,我遇到了一个问题 我的新void方法(即InTransaction)接受一个操作作为参数,我可以将一个匿名方法传递给它: myFunction() { MyObject data1 = null; MyObject data2 = null; UnitOfWork.InTransaction(() => { d

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

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

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

//...