2011-05-04 41 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 類型」中所述的分子類型