[英]Mocking an interface that extends another interface using Moq
Hej好友!
我正在嘗試為類似下面的界面創建一個模擬:
public interface ITheInterface: IEnumerable
{
...
}
通過以下方式:
var theInterfaceMock = new Mock<ITheInterface>();
theInterfaceMock.Setup(x => x.OfType<SomeType>()).Returns(something);
和
var theInterfaceMock = new Mock<ITheInterface>();
theInterfaceMock.As<IEnumerable>();
theInterfaceMock.Setup(x => x.OfType<SomeType>()).Returns(something);
在這兩種情況下,我都得到一個System.NotSupportedException,它基本上告訴我ITheInterface不具有OfType()方法(實際上確實具有)。 有人知道解決此問題的方法嗎?
謝謝!
OfType不是IEnumerable上的方法, 它是稱為Enumberable.OfType的擴展方法 。
我想這就是Moq抱怨的原因。 由於這些是靜態類,因此我認為您需要使用諸如typemock之類的工具。
問題是。 為什么需要模擬OfType()? 您可以相信Enumberable.OfType的Microsoft實現是有效的。 因此,只需模擬IEnumberable接口(GetEnumerator) ,然后返回支持OfType將使用的IEnumerator的模擬。
IEnumerable沒有名為OfType的方法...您是否在尋找IEnumerable? -即使OfOf僅僅是擴展方法 ,您也必須模擬Enumerable-class及其靜態成員。 我認為Moq無法做到這一點-抱歉。
以下是一些相關的問題(可能的解決方法): 如何使用Moq模擬擴展方法? 和moq模擬靜態屬性
我相信這里的問題是OfType是擴展方法。 由於Moq(和其他模擬框架)通過創建要模擬的接口的代理對象/類來工作,因此它僅具有模擬實例方法的能力。 擴展方法只是偽裝的靜態方法。
正如其他已經講過的,OfType不是IEnumerable接口的方法。 但是,您實際上並不需要模擬它,您只需要模擬IEnumerable.GetEnumerator方法即可,它很容易做到:
var enumerable = new Mock<IEnumerable>();
var something = new List<SomeType>
{
new SomeType(),
new SomeType(),
new SomeType(),
};
enumerable.Setup(_ => _.GetEnumerator()).Returns(something.GetEnumerator());
Assert.That(enumerable.Object.OfType<SomeType>(), Is.EquivalentTo(something));
您只需將GetEnumerator方法轉發到“某物”集合之一即可,僅此而已。 您將自動獲得適用於您的模擬的所有擴展方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.