阻止Moq模拟没有默认构造函数的抽象类?

时间:2015-03-24 06:55:26

标签: c# unit-testing moq

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

一个简短的例子:

//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

1 个答案:

答案 0 :(得分:1)

解决方法应该是这样的:

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

但是第一个!您不能创建抽象类的实例,因此您应该实现一个派生自抽象类的类。代码应如下所示:

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

您应该为Abstract class

提供实现
public class InstanceWhichDerivesFromAbstract : Abstract
{
//implementation
}