Dot-Net
使用 Moq 平等地設置模擬的所有方法
假設我有界面
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 的所有(匹配)方法?就像是
mock.SetupAll().Throws(new Exception());或者
mock.SetupAll<int>().Returns(1);(這意味著:設置那些返回類型為 的方法
int)?
這可以通過 來實現
SetReturnsDefault,例如:mock.SetReturnsDefault(1);有關更多資訊,請參見
SetReturnsDefault原始碼:github 上的 Moq