Dot-Net

使用 Moq 平等地設置模擬的所有方法

  • June 16, 2020

假設我有界面

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

引用自:https://stackoverflow.com/questions/19254646