2

我的问题是我无法模拟具有 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

4 回答 4

1

可以使用带有ref关键字的匿名方法,只需在匿名方法中显式指定类型:

(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString())
于 2011-05-04T14:33:48.853 回答
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())
}
于 2011-05-04T13:55:51.443 回答
1

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

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

限制 Moles 的当前实现有几个限制。这些限制不是该方法固有的,可能会在 Moles 的未来版本中得到解决: • Moles 框架仅支持有限数量的方法签名——最多 10 个参数,其中最后一个参数可以是 out 或 ref 参数。 不支持带有指针的方法签名。 密封类或静态方法不能被存根,因为存根类型依赖于虚拟方法分派。对于这种情况,请使用本文档后面的“痣类型”中所述的痣类型

于 2012-05-15T08:25:58.207 回答
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();
} 

它具有新的价值,但可能有更好的方法。

于 2012-03-22T13:52:19.463 回答