我喜欢使用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
答案 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
}