20

Moqを使用してC#でインデクサーを設定する方法を理解するのに問題があります。Moqのドキュメントは弱く、私は多くの検索を行いました...私がやりたいことは、Moqのインデックス付きプロパティの設定方法のソリューションと似ています。

var someClass = new Mock<ISomeClass>();
someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);

上記を変更して、任意のインデックスと値で機能するようにしたいので、次のようなことができます。

someClass.Object.SomeIndexedProperty[1] = 5;

現在、次のものがあります。これは、インデックス付きプロパティゲッターに最適ですが、値を設定した場合、Moqはそれを無視します。

var someValues = new int[] { 10, 20, 30, 40 };
var someClass = new Mock<ISomeClass>();
someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()])
    .Returns<int>(index => someValues[index]);

// Moq doesn't set the value below, so the Assert fails!
someClass.Object.SomeIndexedProperty[3] = 25;
Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);
4

3 に答える 3

12

私は自分の問題の解決策を見つけました。考え方を変える必要があります...モックのインデクサーセッターが正しい値で呼び出されているAssertことを確認するためにNUnitを使用することを検討していました。someClass

Moqでこれを行うためにサポートされている方法は、VerifySet関数を使用することのようです。不自然な例:

someClass.Object.SomeIndexedProperty[3] = 25;
someClass.VerifySet(mock => mock.SomeIndexedProperty[3] = 25);

ユニットテストはSomeIndexedProperty[3]25に設定されているため合格しますが、それ以外の場合は不合格になります。

于 2010-05-27T13:51:51.273 に答える
6

Moq3.1.416.3の使用

インデクサーのセットアップは機能しません(代入ステートメントが除外されることを意味する式を使用するため)

したがって、次のようなSetupSetを使用する必要があります

_settingsStore.SetupSet(store => store["MruNotes"] = It.IsAny<string>())
                .Callback<string,string>( (key, value) => persistedValue = value);

小さな注意:この式は、キーが「MruNotes」の場合にのみ一致します。It.IsAnyのようなマッチャーをキーに使用できませんでした。

于 2010-11-27T18:47:38.213 に答える
3

テストでは、インデクサーのゲッターに対する唯一の設定された期待値-これは常に配列から対応する値を返します。インデクサーは本物のようには動作しません。あなたはそれを修正するためにいくつかのことを試みることができます:

  1. このインデクサーをスタブできるかどうかを確認できます。私は個人的にRhinoMocksを使用しているので、これが実装されているかどうかわかりません

    someClass.SetupProperty(f => f.SomeIndexedProperty);
    
  2. セッターをモックして、基になる配列を変更することもできます。私の最初の推測は、これらの線に沿って何かを試すことです(それが機能するという保証はありません):

    someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()] = It.IsAny<int>())
    .Callback((index, value) => someValues[index] = value);
    
  3. または、ISomeClassインターフェイスが十分に小さい場合は、スタブ実装を自分で作成することもできます(これにより、インデクサーがディクショナリ、配列などとして実装されます)。

 

于 2010-05-27T13:49:28.440 に答える