2012-04-26 58 views
2

抓我的頭如何做到這一點。單元測試的城堡類代理

假設我有一個具體的類Foo有2個虛擬方法,Execute()和。 Execute()將撥打GetFile。我想確保一旦這樣做,GetFile()將拋出幾個不同的例外,Foo應該以可測試的方式優雅地處理。

對於我的單元測試,我預想實例從城堡項目DynamicProxy < Foo>,我攔截GetFile()拋出異常,然後調用DynamicProxy對象的Execute()方法,並測試結果,但我不能看看如何做到這一點。

這可能/實際嗎?如果是這樣,動態代理對象的創建會是什麼樣子?

回答

2

您不需要手動編寫自己的代理,因爲大多數模擬框架都支持您的方案。

下面是使用Moq(MOQ將創建一個動態代理內部你)一個例子:

public class SomeException : Exception { } 

public class Foo 
{ 
    public virtual int Execute() 
    { 
     try 
     { 
      GetFiles(); 
     } 
     catch (SomeException) 
     { 
      return 1; 
     } 
     return 0; 
    } 

    public virtual void GetFiles() 
    { 
     //... 
    } 
} 

[Test] 
public void FooTest() 
{ 
    var fooUnderTest = new Mock<Foo>(); 
    fooUnderTest.CallBase = true; 
    fooUnderTest.Setup(f => f.GetFiles()).Throws(new SomeException()); 
    var result = fooUnderTest.Object.Execute(); 
    Assert.AreEqual(1, result); 
} 

你只需要照顧到設置Callbase = true這將:

調用基類如果沒有期望會覆蓋 成員(即Rhino Mocks中的「部分模擬」),則實施:默認爲false。

+0

傑出。正是我在找什麼。 – 2012-04-26 17:27:07