无法让moq从类型创建实例 - “没有为此对象定义的无参数构造函数”。

时间:2013-06-29 11:15:28

标签: .net moq createinstance

我正在尝试使用Moq来存储我希望通过Activator.CreateInstance动态创建的数据类,当我传递它的类型时(通过Moq.Object.GetType(),其中Moq是存根实例)但是我得到了System.MissingMethodException {"No parameterless constructor defined for this object."}

我做错了什么?我不想改变我的主题代码以适应Moq。

测试

private Test() ...
{
   var recordStub = new Mock<IRecord>();
   var record = recordStub.Object;
   var recordDefinition = new RecordDefinition() 
                              { MappedRecordClassType = record.GetType(), ... 

   var newRecord = CreateDataRecord(recordDefinition);
   ...
}

主题

private IRecord CreateDataRecord(RecordDefinition recordDefinition)
{
   var result = Activator.CreateInstance(recordDefinition.MappedRecordClassType) 
                       as IRecord;
   return result;
}

3 个答案:

答案 0 :(得分:2)

您正在创建record.GetType()的实例,因为record = recordStub.Object是Moq在运行时动态生成的对象,在您的情况下实现IRecord,那么您基本上所做的是创建动态生成的对象的实例,似乎Activator.CreateInstance()找不到不对该类型进行任何参数的公共构造函数。现在我不知道你为什么要做你正在做的事情,但我从来没有见过有人使用这样的模拟所以我认为你应该重新考虑你的测试。

答案 1 :(得分:1)

在代码中的某处,Moq正在尝试实例化一个您未被模拟或直接作为类公开的对象。无论哪种方式,所述对象都没有具有0个参数的公共构造函数。

您需要跟踪测试中没有调用公共0参数构造函数的对象,并修复它或以其他方式解决它。

我在最近的一个项目中遇到了同样的事情,在大多数情况下,我们将对象表示为类本身而不是接口。

答案 2 :(得分:0)

我同意Sniffer。你正在做的是传递typeof IRecord,然后让你的Activator创建它的实例。但是,它是一个接口,所以你不能直接创建它的实例,你需要一个具体的类来做到这一点。

如果在这个测试中有价值,那么你需要做的是创建一个老式的,手写的存根...这是一个几乎是空的类,它只是实现你的IRecord接口并返回您的测试需要的值(没有实际工作)。

但是,那么你真正要做的就是测试Activator.CreateInstance可以找到该类型并创建它的实例,我同意Sniffer,你基本上是在测试第三方代码。您可能不会也不应该使用此方法。