2011-05-04 63 views
2

我遇到了问题,我无法模拟具有参数参数的方法。 我想嘲笑走的方法的签名如下:使用参数参数模拟方法的语法

class ContractRepository 
... 
public long GetValueAndIncrement(ref Counter counter) 
{ 
... 
} 

我试着模拟它是这样的:

Random myRandomizer = new Random(); 
var contractRepo = new SIContractRepository(); 
contractRepo.GetValueAndIncrementCounterRef = ((internalCounter) => Int64.Parse(myRandomizer.Next().ToString())); 

但是,编译器告诉我,我缺少的“裁判”关键字,但是当我试图像这样

Random myRandomizer = new Random(); 
var contractRepo = new SIContractRepository(); 
contractRepo.GetValueAndIncrementCounterRef = ((ref internalCounter) => Int64.Parse(myRandomizer.Next().ToString())); 

我得到一个错误,裁判是一个无效的表达式

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

回答

1

你根本无法使用匿名方法,在这种情况下,因为他们既不支持也不裁判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

可以使用匿名方式与裁判关键字,只是明确指定匿名方法的类型:我不知道这是否是一个正确的方式来

(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString()) 
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(); 
} 

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

1

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

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

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