使用ref参数模拟方法的语法

时间:2011-05-04 13:52:58

标签: c# mocking ref moles

我遇到的问题是我无法模拟具有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是无效的表达式

不幸的是,谷歌在这里没有帮助。 :( 有什么想法吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

可以使用 ref 关键字的匿名方法,只需在匿名方法中明确指定类型:

(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString())

答案 2 :(得分:1)

请记住,当前版本的Moles仅支持ref和out参数作为方法的LAST参数。

http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf

限制 目前Moles的实施有几个局限性。这些限制不是 该方法固有的,可能在未来的Moles版本中得到解决: Moles框架仅支持有限数量的方法签名 10个参数,最后一个参数可以是out或ref参数。 不支持带指针的方法签名。 由于存根类型依赖,因此无法对存根类或静态方法进行存根 虚方法调度。对于这种情况,使用“鼹鼠”中描述的痣类型 类型“在本文档的后面

答案 3 :(得分:0)

我不确定这是否是应用痣的正确方法,但我做到了。它有效。

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

它适用于新的价值,但可能有更好的方法。