2012-04-25 46 views
0

我有構造函數調用構造函數的類。當我爲這個類創建模擬時,函數是從構造函數中調用的。我想阻止函數調用。我可以做嗎?如何忽略構造函數中的調用函數?

示例代碼:

public class Foo 
{ 
    public Foo() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     //some code 
    } 
} 

[TestFixture] 
public class Test 
{ 
    [Test] 
    public void Test_Foo() 
    { 
     Foo foo = MockRepository.GenerateMock<Foo>(); 

     //some test 
    } 
} 

注:

  1. 我不希望添加接口,像Foo : IFoo
  2. 我不想添加第二個構造函數。
+2

你不能那樣做。您可能需要添加第二個構造函數或將'.Initialize'委託給依賴項並注入。你究竟在測試什麼?測試嘲弄的對象毫無意義,我希望你知道。 – 2012-04-25 12:07:11

+0

您可以在不使用'FormatterServices.GetUninitializedObject(...)'調用構造函數的情況下創建Foo的實例。詳情請看這裏:http://stackoverflow.com/questions/178645/how-does-wcf-deserialization-instantiate-objects-without-calling-a-constructor – JYL 2015-02-17 13:57:24

回答

0

一般來說,您只能創建接口或抽象類的模擬。

你打算測試什麼?如果是Foo類,那麼創建它的模擬是完全錯誤的。

通常情況下,您會創建被測試類的那些依賴關係的模擬,這些依賴關係難以設置或需要很長時間才能運行。這種依賴關係的最常見示例是存儲庫或Web服務。

+0

你正在寫。這是一個簡單的例子,但這個例子顯示了我的問題。讓我們把Foo當成抽象類吧。 – Rougher 2012-04-25 09:55:04

+0

無論如何,如果你測試Foo,那麼創建if的模擬是錯誤的方法。 – 2012-04-25 10:23:43

+0

@IvanGerken:*「你可以創建模擬接口或抽象類」* - 這是不正確的;犀牛也可以嘲笑普通課程,沒有什麼特別的。如果這個類暴露了虛擬方法,那麼這些方法就可以被模仿,就好像它是一個接口一樣。 – 2012-04-25 12:09:22

0

abt如何添加布爾標記

布爾標誌= false;

[測試]

public void Test_Foo() 
{ 
    if(flag == true) 
    { 
     Foo foo = MockRepository.GenerateMock<Foo>(); 

    } 
    //some test 
} 
+0

我不想避免調用MockRepository.GenerateMock ();. – Rougher 2012-04-25 09:56:09

1

當你嘲笑的一類,還有創建的代理(犀牛使用Castle.DynamicProxy.DefaultProxyBuilder),它從你的類繼承。繼承和C#中的任何地方一樣。當您創建派生類型的實例時,將調用基類型的所有構造函數(直到對象)。因此,當創建代理實例(通過Activator.CreateInstance(typeof(proxy)))時,Foo的構造函數也會被調用。你無法避免這一點。你可以使用接口模擬,或者向構造函數提供一些參數來禁止初始化。嘲諷抽象或具體類會嘲笑模擬的所有優點 - 您的測試取決於,它不會被模擬(構造器,非虛擬方法和默認實現)。而且你的SUT(被測系統)不再被單獨測試。破壞的測試可能是抽象或具體類內部發生變化的結果。

相關問題