用ref参数模拟方法的语法
本文关键字:语法 方法 模拟 ref 参数 | 更新日期: 2023-09-27 17:54:55
我有一个问题,我不能模拟一个有ref参数的方法。我想要模拟掉的方法的签名如下:
class ContractRepository
...
public long GetValueAndIncrement(ref Counter counter)
{
...
}
我试着这样嘲笑它:
Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));
但编译器告诉我,我错过了"ref"关键字,但当我尝试像这样
Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((ref internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));
我得到一个错误,ref是一个无效表达式
不幸的是,谷歌在这里没有帮助。:(什么好主意吗?
在这种情况下不能使用匿名方法,因为它们既不支持ref也不支持out参数。您需要创建一个"真正的"方法。
public void SetupMock()
{
Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = GetValueAndIncrementMock;
}
public long GetValueAndIncrementMock(ref Counter counter)
{
return Int64.Parse(myRandomizer.Next().ToString())
}
您可以通过ref关键字使用匿名方法,只需在匿名方法中显式指定类型:
(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString())
请记住,当前版本的mole只支持ref和out参数作为方法的LAST参数。
http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf的局限性mole的当前实现有几个限制。这些限制并不是该方法固有的问题,可能会在以后的mole版本中解决:·mole框架只支持有限数量的方法签名10个参数,最后一个参数可以是out或ref参数。不支持带有指针的方法签名。密封类或静态方法不能存根,因为存根类型依赖于虚拟方法调度。对于这种情况,请使用"mole"中描述的mole类型在本文档后面键入"
我不确定这是否是应用痣的正确方法,但我做到了。
///method get call in unit test
public static void DetermineSprintCorporateLiableCustomer()
{
COptions p2 = new COptions();
MGetCOptions.CustomerInfoCallerOptionsRef = (ref COptions p1) =>
{
if (p1 != null && p1 != null && p1.Type.Equals(
"Data", StringComparison.OrdinalIgnoreCase))
{
p1.Type = "P";
p1.Indicator = true;
}
p2 = p1;
};
}
当该部件在试运行中执行时,新的p2可用。以下是我的设想。
// need to unit test Coptions.Type="Data"
public static MainMethod(Coptions)
{
Mclass.Method(ref Coptions);
If(COptions.Type="B")
Do something();
}