2013-10-08 36 views
6

假設我有接口使用起訂量建立一個模擬的所有方法同樣

public interface A { 
    int Foo1(); 

    int Foo2(); 

    int Foo3(); 
} 

和測試方法與模擬(使用Moq)像

Mock<A> mock = new Mock<A>(); 

現在有基本上有兩種測試方案:

方案1

我想測試一下,如果接口實現在任何方法上拋出特定的異常,我的測試系統會做什麼。所以,我想設置的所有方法拋出相同的異常像

mock.Setup(x => x.Foo1()).Throws(new Exception()); 
mock.Setup(x => x.Foo2()).Throws(new Exception()); 
mock.Setup(x => x.Foo3()).Throws(new Exception()); 

方案2

我想測試我的系統下測試做什麼,如果這些方法返回的任何數字。所以,我能想到的設置的模擬像

mock.Setup(x => x.Foo1()).Returns(1); 
mock.Setup(x => x.Foo2()).Returns(1); 
mock.Setup(x => x.Foo3()).Returns(1); 

原因: 我對系統下測試許多不同的單元測試。其中一些是對商業邏輯的測試,例如它們有所不同,例如返回什麼值。但有些只是對一般行爲的小測試,例如如果被測系統拋出一個異常,如果其中一個使用的組件拋出一個異常。或者相反,如果所有組件都按預期運行,則被測系統不會引發異常。對於這些小測試,我現在正在使用類似上面的代碼。

問題: 有沒有更聰明的方法來初始化一個模擬的所有(匹配)方法同樣的方式?像

mock.SetupAll().Throws(new Exception()); 

mock.SetupAll<int>().Returns(1); 

(這意味着:設置那些具有的int返回類型的方法)?

+1

我不認爲這些都支持。請注意,如果您在模擬上使用Mock.Strict,例如var mock = new Mock (MockBehavior.Strict);如果您的測試中沒有爲這些模擬配置設置,則測試將失敗。 – Spock

+1

我敢肯定,Moq沒有任何可以做到這一點的原生代碼,但是你可以編寫一個擴展方法來實現你想要的反射。 –

回答

相關問題