【发布时间】:2021-12-16 08:47:44
【问题描述】:
我正在尝试模拟一个具有T : IFoo 约束的泛型方法
但是起订量似乎无法理解转换并给出以下错误:
类型 'Moq.It.IsSubtype
' 不能在泛型类型或方法中用作类型参数“T” 'IMyClass.DoSomething(Action)'。没有隐式引用 从转换 'Moq.It.IsSubtype ' 到 'SomeNamepace.IFoo'。
public interface IFoo
{
}
class Foo : IFoo
{
}
public interface IMyClass
{
public IDisposable DoSomething<T>(Action<T> asd) where T : IFoo;
}
public class MyTest
{
[Test]
public void SomeTest()
{
var mock = new Mock<IMyClass>();
mock.Setup(e => e.DoSomething(It.IsAny<Action<IFoo>>())).Returns(Mock.Of<IDisposable>());
// What I want but gives compiler error
// mock.Setup(e => e.DoSomething(It.IsAny<Action<It.IsSubtype<IFoo>>>())).Returns(Mock.Of<IDisposable>());
// Action<IFoo> would work, but in real code its not used like that
Action<Foo> myAction = (e) => { };
var result = mock.Object.DoSomething(myAction);
result.Dispose(); // Null reference exception
}
}
【问题讨论】:
-
@madreflection 对,但在这种情况下,嵌套泛型类型
IsSubtype<T>肯定不会实现IFoo? -
你到底想在这里测试什么?显然传入的泛型将是
IFoo的子类型。如果不是它就不会编译? -
@canton7:不,你是对的,它没有。它只实现了 Moq 自己的
ITypeMatcher。我只是指出这不是语法错误(至少不是你想象的那样)。文档说这是你应该做的。在处理受约束的泛型类型参数时,这可能是库的限制。 -
@Liam 在我的真实代码 DoSomething 中返回一个 IDisposable,所以我希望它返回一个 Mock
,但在最小示例中删除了它。否则我得到空异常