【问题标题】:Generic method for creating Mock<interface> by MoqMoq 创建 Mock<interface> 的通用方法
【发布时间】:2017-10-04 09:06:38
【问题描述】:

我正在尝试创建一些抽象类,该类将保留一些常用操作来按 Moq 准备存根。我写了一些东西,但我无法克服错误

public abstract class StubsCreatorAbstract
{
    public Mock<T> GenerateObject<T>() where T : IStub
    {
        var mock = new Mock<T>();
        return mock;
    }

    public Mock<D> SetupValue<T, D>(Mock<D> stub, string nameOfField, T value) where D : IStub
    {
        var field = typeof(D).GetProperty(nameOfField);
        if (field == null)
        {
            throw new ArgumentException("Field do not exist");
        }

        field.SetValue(stub.Object, value);
        return stub;
    }
 }

问题是:Mock 必须是引用类型。我的问题是——有可能克服这个问题吗?提前致谢

更新:

这是编译器错误。关于 T 的问题 - 它在说

"the type 'T' must be a reference type in order to use it as parameter 'T' in the generic type or method 'Mock<T>".

【问题讨论】:

  • Mock must be a reference type. 那是编译器错误吗?运行时错误?还有什么?请向我们展示您用来调用GenerateObject的代码。
  • 这是编译器错误。 IDE 说 Mock 是错误的。关于 T 的问题 - 它是说“类型 'T' 必须是引用类型才能将其用作泛型类型或方法 'Mock 中的参数 'T'”。

标签: c# unit-testing moq


【解决方案1】:

简短的回答是:

public Mock<T> GenerateObject<T>() where T : IStub
{
    var mock = new Mock<T>();
    return mock;
}

行不通。相反,您应该使用:

new Mock<YourTypeHere>();

改为。

至于为什么您的原始代码不起作用,我做了一些研究,但我不是 100% 确定原因。

【讨论】:

    【解决方案2】:

    您似乎正在使用非引用类型作为通用约束。我相信 IStub 是您正在使用的具体类中实现的接口。如果你像下面这样指定约束,它将正常工作。

    如果您想要更具体的约束,请让您的类从基类继承并在此处将其作为约束。

     public abstract class StubsCreatorAbstract
    {
        public Mock<T> GenerateObject<T>() where T : class 
        {
            var mock = new Mock<T>();
            return mock;
        }
    
        public Mock<D> SetupValue<T, D>(Mock<D> stub, string nameOfField, T value) where D : class
        {
            var field = typeof(D).GetProperty(nameOfField);
            if (field == null)
            {
                throw new ArgumentException("Field do not exist");
            }
    
            field.SetValue(stub.Object, value);
            return stub;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多