3

IDataRecordMoqを使用してモックしようとしています。

モックは次のように作成されました。

Mock<IDataRecord> mockDataRecord = new Mock<IDataRecord>();

テスト中の行は次のとおりです。

DateTime timestamp = dataRecord.GetValueOrDefault<DateTime>("QUEUE_ADD_TS");

試しました:

mockDataRecord.Setup(r => r.GetValueOrDefault<DateTime>("QUEUE_ADD_TS")).Returns(now);

...しかし、実行時エラーが発生します:

式は、モックされたオブジェクトに属していないメソッドを参照しています: r => r.GetValueOrDefault("QUEUE_ADD_TS")

の代わりIt.IsAny<String>()に置き換えてみまし"QUEUE_ADD_TS"たが、違いはありませんでした。これは簡単なはずですが、頭を悩ませています-アドバイスに感謝します!

4

2 に答える 2

0

ほとんどのモック フレームワークは内部で動的プロキシを使用するため、静的メソッドまたは拡張メソッドをモックすることはできません。

テストでは、拡張メソッドをスタブしないでください。代わりに、次のように元のメソッド自体をスタブします。

mockDataRecord.Setup(r => r.GetValue<DateTime>("QUEUE_ADD_TS")).Returns(now);

次のように、拡張メソッドを個別にテストする必要があります。

  1. GetValue メソッドをスタブし、GetValueOrDefault がスタブ化された値を返すことをアサートします。

  2. GetValue メソッドをスタブ化せず、GetValueOrDefault がデフォルト値を返すことをアサートします。

于 2013-05-08T08:42:25.483 に答える