用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参数模拟方法的语法

在这种情况下不能使用匿名方法,因为它们既不支持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();
}