繁体   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