在没有默认构造函数的情况下阻碍 Moq 模拟抽象 类?

Hinder Moq to mock abstract classes without default constructor?

我喜欢使用 Moq 的 DefaultMock.Mock 行为。现在我遇到了问题,在如此模拟的对象层次结构中,一个来自抽象 class 的对象没有默认构造函数。当有人现在试图获取这个对象时,我得到一个异常。有没有办法解决这种行为?

一个简短的例子:

//The abstract class
public abstract class Abstract
{
    protected Abstract(string foo)
    {
    }
}

//The mocked interface
public interface ITestClass
{
    Abstract Abstract { get; }
}

//The mock
internal class TestClass
{
    public static void Main()
    {
        Mock<ITestClass> testMock = new Mock<ITestClass> {DefaultValue = DefaultValue.Mock};
        Abstract foo = testMock.Object.Abstract;
    }
}

问题出现在 Abstract foo = testMock.Object.Abstract; 行,异常如下:

System.ArgumentException was unhandled
  HResult=-2147024809
  Message=Can not instantiate proxy of class: UsedLibrary.Abstract.
Could not find a parameterless constructor.
Parametername: constructorArguments
  Source=Castle.Core
  ParamName=constructorArguments

解决方法应该是这样的:

Mock<ITestClass> testMock = new Mock<ITestClass> {DefaultValue = DefaultValue.Mock};
testMock.SetupGet(p => p.Abstract).Returns(new Abstract("foo"));
Abstract foo = testMock.Object.Abstract;

但是首先!您不能创建抽象 class 的实例,因此您应该实现从抽象实例派生的 class 。代码应如下所示:

testMock.SetupGet(p => p.Abstract).Returns(new InstanceWhichDerivesFromAbstract("foo"));

您应该为抽象提供一个实现 class

public class InstanceWhichDerivesFromAbstract : Abstract
{
//implementation
}