在没有默认构造函数的情况下阻碍 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
}
我喜欢使用 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
}