2011-10-18 59 views
5

我最近試圖使用FakeItEasy,但是我無法從具體的類創建假而沒有圍繞許多怪癖工作。FakeItEasy創建一個類的假

我試過如下:

public class MyObject { 
public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

這就造成了一個構造函數不具有匹配Arguements異常

發現旁邊我想:

public class MyObject { 
public MyObject(string temp){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(x => x.WithArgumentsForConstructor(() => new MyObject("temp"))); 

這就造成了類似的錯誤。

最後我想:

public class MyObject { 
//public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

這讓我終於創建了假冒的。我很困惑,爲什麼大多數僞造具體類的例子暗示了這一點,我發現它更容易?爲什麼使用記錄的方法,上面的試驗#2不起作用?

僞造未記錄的具體類是否存在一些限制?

回答

0

我無法重現該問題,運行等效代碼時,它適用於我。你能否創建一個能夠再現問題的vs解決方案?submit an issue on GitHub

1

我認識到這是一個老問題,所以我發佈這個答案的任何其他誰有這個問題,並絆倒到這個問題。我能夠複製類似的問題。

我有一個類:

public class Service : IService 
{ 
    public Service (int prNum) 
    { 
    //call to a c++ wrapper class (this is where the problem occurs) 
    //some other calls 
    } 
} 

我試圖創建服務類作爲一個單元測試假的:

private Service fakeServ = A.Fake<Service>((x => x.WithArgumentsForConstructor(() => new Service(3)))); 

我收到了同樣的錯誤:構造不帶找到匹配的參數異常

最後我用調試器進入了A.Fake調用,發現構造函數中的代碼(即A.Fake確實調用過)未能初始化一個塊由於Visual Studio未以管理員模式運行,導致全局內存不足。 (CreateFileMapping,錯誤代碼5,System Error 0x5: CreateFileMapping()

我將visual Studio設置爲以管理員身份運行並且問題已解決,假的已創建。

似乎假的,用帶有參數的構造函數創建的確是通過構造函數運行的(這正是我希望通過創建假來避免的,因爲全局內存不是我單元測試焦點的一部分,將不得不考慮是否有另一種方式,我應該創造這一點)。

您發佈的代碼並不表明您正在調用包裝類或創建全局內存,但您可以嘗試使用調試程序進入僞造創建調用,以查看構造函數是否開始運行以及是否存在失敗構造函數以及返回的錯誤。