假設我有接口使用起訂量建立一個模擬的所有方法同樣
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
返回類型的方法)?
我不認爲這些都支持。請注意,如果您在模擬上使用Mock.Strict,例如var mock = new Mock(MockBehavior.Strict);如果您的測試中沒有爲這些模擬配置設置,則測試將失敗。 –
Spock
我敢肯定,Moq沒有任何可以做到這一點的原生代碼,但是你可以編寫一個擴展方法來實現你想要的反射。 –