Moq不能模拟没有特定泛型类型的方法

本文关键字:泛型类型 方法 不能 模拟 Moq | 更新日期: 2023-09-27 18:15:47

我有一个测试,找到从BaseClass继承的所有类。BaseClass有一个使用泛型方法的属性:

abstract class BaseClass 
{
   public MyTools Tools { get; set;}
   public abstract List<TEntity> GetAll();
   public virtual IList<TEntity> Convert<TEntity, TEntityOther>() 
   {
       //...
   }
}
class MyTools 
{
   IList<T> List<T>();    
}

然后,我需要模拟T List<T>()方法。该方法用于Create法。例如:

class MyClass: BaseClass<MyEntity>
{
    public override List<MyEntity> GetAll()
    {
        var x = this.MyTools.List<SomeClass>();
        return this.Convert<MyEntity, SomeClass>(x);
    }
}

我不知道GetAll中使用什么类型来调用List方法。

这是我的测试:

var xobjects = this.GetTypeInNamespace(myAssembly, typeof(BaseClass<>));
foreach(var obj in xobjects) 
{
   var myTools  = new Mock<MyTools>();
   //here is my problem
   myTools.Setup(x => x.List< ANY >()).Returns(new List< ANY >());
   var iobj = this.CreateInstance(obj);
   iobj.MyTools = myTools.Object;  
   var result = iobj.GetType().GetMethod("GetAll").Invoke(iobj, null);
   ((ICollection)result).Count.Should().Be(0);
}

我如何为任何T设置方法List <T> ?

我不知道T是什么类型,我也不关心它是什么类型

Moq不能模拟没有特定泛型类型的方法

我知道这个问题已经有3年了,但是自从moq 4.13以来,可以指定It.IsAnyType进行泛型类型匹配。