【问题标题】:Moq can not mock a method without specific generic typeMoq 不能模拟没有特定泛型类型的方法
【发布时间】:2017-03-13 22:03:40
【问题描述】:

我有一个测试可以找到从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&lt;T&gt;() 方法。该方法用于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 &lt;T&gt;

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

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • @Nkosi 准备好了,我添加了更多细节
  • 这个示例方法还是让人迷惑this.Convert&lt;MyEntity, SomeClass&gt;(x);
  • 接口MyTools在“实际项目”中除了所讨论的泛型方法之外是否包含许多其他成员?因为如果使用 Moq 很难做到这一点,那么编写一个实现接口的虚拟类并注入它可能很容易,而不是使用 Moq。

标签: c# generics testing mocking


【解决方案1】:

我知道这个问题已经存在 3 年了,但由于 moq 4.13 可以指定 It.IsAnyType 进行泛型类型匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2016-06-06
    • 2018-06-28
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多