1

Moq を使用して、Activator.CreateInstance を介して動的に作成したいデータ クラスをスタブ化しようとしています (Moq がスタブ インスタンスである Moq.Object.GetType() を介して) その型を渡しますが、取得します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;
}
4

3 に答える 3

2

のインスタンスを作成しています。record.GetType()これrecord = recordStub.Objectは、実行時に Moq によって動的に生成されたオブジェクトでありIRecord、状況に応じて実装されます。本質的に行っているのは、動的に生成されたオブジェクトのインスタンスを作成することでありActivator.CreateInstance()、パブリックを見つけることができないようですその型で引数を取らないコンストラクター。なぜあなたが何をしているのかわかりませんが、そのようなモックを使用している人を見たことがないので、テストを再考する必要があると思います.

于 2013-06-29T21:43:28.833 に答える
1

コードのどこかで、Moq は、モックアウトしていないか、クラスとして直接公開されているオブジェクトをインスタンス化しようとしています。いずれにせよ、上記のオブジェクトには、パラメーターが0のパブリックコンストラクターがありません。

public 0 パラメーター コンストラクターを持たないオブジェクトが呼び出されているテスト内の場所を追跡し、それを修正するか、別の方法で回避する必要があります。

私は最近のプロジェクトで同じことに遭遇しました。ほとんどの場合、インターフェイスではなくクラス自体としてオブジェクトを表示していました。

于 2013-07-01T04:02:16.527 に答える
0

私はスニファーに同意します。あなたがしているのは、 を渡し、typeof IRecordActivator にそのインスタンスを作成するように依頼することです。ただし、これはインターフェイスであるため、インスタンスを直接作成することはできません。そのためには具象クラスが必要です。

このテストに価値がある場合は、昔ながらの手書きのスタブを作成する必要があります...つまり、単にIRecordインターフェイスを実装し、値を返す (実際の作業を行わない)ほぼ空のクラスです。あなたのテストが必要です。

しかし、実際に行っているのはActivator.CreateInstance、その型を見つけてそのインスタンスを作成できるテストだけです。Sniffer に同意します。基本的にサードパーティのコードをテストしています。おそらく、この方法については触れませんし、取り上げるべきではありません。

于 2013-07-01T04:49:30.083 に答える