1

単体テストで Moq に問題が発生しましたが、どこが間違っているのかわかりません。インターフェイスに次のようなメソッドがあります。

void WriteToRegistryKey (String key, Object value);

そして、私は次のように単体テストしています:

var testRegistry = new Mock<IRegistry>();
testRegistry.Setup(x => x.WriteToRegistryKey(It.IsAny<string>(), It.IsAny<int>()));

Utility testUtility = new ConfigUtil(testRegistry.Object);

testUtility.UpdateRegistry();

testRegistry.Verify(x => x.WriteToRegistryKey("MaxNumLogFiles", 10));

内部で testUtility.UpdateRegistry() を呼び出すと、WriteToRegistryKey が呼び出されます。WriteToRegistryKey メソッドが正しい値を渡すことをテストしたいと思います。

ただし、テストを実行すると次のように表示されます。

Moq.MockException : 
Expected invocation on the mock at least once, but was never performed: x => x.WriteToRegistryKey("MaxNumLogFiles", (Object)10)

Configured setups:
x => x.WriteToRegistryKey(It.IsAny<String>(), It.IsAny<Int32>()), Times.Never

Performed invocations:
IRegistry.WriteToRegistryKey("MaxNumLogFiles", 10)

testRegistry.Verify を次のように変更すると:

testRegistry.Verify(x => x.WriteToRegistryKey("MaxNumLogFiles", It.IsAny<object>()));

それは機能するので、問題は WriteToRegistryKey メソッドが取る 2 番目のパラメーターと、int とオブジェクトの違いにあるようですが、私はそれを理解できないようです。

助けてくれてありがとう!

4

1 に答える 1

3

メソッドがそこで呼び出される方法testUtility.UpdateRegistry();の実装の本体を確認すると役立ちます。.WriteToRegistryKey

ただし、モックをセットアップする行を削除し ます。正しい引数で呼び出されたかどうかをテストしたいからです。Moqでそれをセットアップする理由はありません。testRegistry
testRegistry.Setup(x => x.WriteToRegistryKey(It.IsAny<string>(), It.IsAny<int>()));

そして、あなたのテストが testRegistry.Verify(x => x.WriteToRegistryKey("MaxNumLogFiles", It.IsAny<object>()));

次の 2 つのことを意味します。

  1. WriteToRegistryKey メソッドが10以外の値で呼び出されました - UpdateRegistry メソッドのエラー
  2. または、次のようにセットアップするため、null です。

It.IsAny<string>(), It.IsAny<int>()

使用する場合It.IsAny<type>()もあるかもしれませんnull

于 2012-08-02T19:23:52.153 に答える