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