Moq创建Mock <interface>的通用方法

时间:2017-10-04 09:06:39

标签: c# unit-testing moq

我正在尝试创建一些抽象类,它将保留一些用于由Moq准备Stub的常用操作。我写了一些东西,但我无法克服错误

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;
    }
 }

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

更新

该编译器错误。有关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>".

2 个答案:

答案 0 :(得分:0)

简短的回答是:

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

不起作用。相反,你应该使用:

new Mock<YourTypeHere>();

代替。

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

答案 1 :(得分:-1)

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

如果你想要更具体的约束,那么让你的类继承自基类并在此处作为约束。

ILogger.Error(Exception)