2011-07-24 85 views
2

我有一個使用本地私有方法從Db獲取數據的公共方法。如何在公共課程中轉移「非公開」方法

private string SomeMethod(string) { ... Doing some operations ... string data = GetDBData(string); Doing some operations ... }

我想用痣,所以我的測試將不需要DB疏導/隔離私有方法GetDBData(串)。

顯然,我的問題是:如何做到這一點? 謝謝 URIA

編輯
其他信息:

我試圖改變方法存取既公開和內部保護, 在這兩種情況下,我現在可以看到的方法以摩爾。 但是當運行測試時,原始方法仍在使用中,而不是我在PexMethod中實現的繞行。

回答

1

我想通了

如果我有私人的someMethod

public class MyClass 
{ 
    private string SomeMethod(string str){} 
} 

公共MyClass的,如果你想要去痣,你需要在測試方法中使用AllInstances的的someMethod方法:

[PexMethod] 
SomeMethod(string str) 
{ 
    MMyClass.AllInstances.SomeMethod = (instance, str) => { return "A return string"; }; 
} 
  • 注意到lambda接收到一個實例參數爲第一個參數。我不確定它的功能是什麼。
+0

實例參數允許您使用委託內的原始調用實例。 –

+0

不要忘記將此標記爲您接受的答案! =) –

2

您可以嘗試以下任何一種。

  • 使該方法內部像這樣添加一個屬性集:

    [assembly: InternalsVisibleTo("<corresponding-moles-assembly-name>")]

  • 更改爲方法訪問受保護的虛擬然後用存根。

  • 重構類,以便它將接口(IDataAccessObject)作爲構造函數參數,SomeMethod作爲該接口的方法之一,然後將該接口的存根傳遞給測試方法中的類。