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

时间:2016-10-31 18:51:48

标签: c# generics testing mocking

我有一个测试,可以找到从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是什么类型,我不在乎它是什么类型。

1 个答案:

答案 0 :(得分:0)

我知道这个问题已有3年历史了,但是由于moq 4.13可以为通用类型匹配指定It.IsAnyType