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();
}
//...
运行 测试时应有的状态。
我最近在我的存储库中添加了一个新方法,因为我需要在事务模式下处理我的数据库调用并且一切正常,但现在我正在尝试调整单元测试,我有一个问题。
我的新 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();
}
//...
运行 测试时应有的状态。