簡體   English   中英

模擬使用Moq擴展另一個接口的接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM