1

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

我究竟做错了什么?我不想更改我的主题代码以适应最小起订量。

测试

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;
}
4

3 回答 3

2

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

于 2013-06-29T21:43:28.833 回答
1

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

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

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

于 2013-07-01T04:02:16.527 回答
0

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

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

但是,实际上您所做的只是测试Activator.CreateInstance可以找到该类型并创建它的实例,我同意 Sniffer,您基本上是在测试第 3 方代码。您可能不会也不应该涵盖此方法。

于 2013-07-01T04:49:30.083 回答