web-dev-qa-db-ja.com

Moqを使用して、モックされたメソッドが複雑なパラメーターの特定の値で呼び出されたことを確認できますか?

したがって、次のクラスをあざけると仮定します。

public class ClassAParams
{
    public int RequestedId { get; set; }
    public string SomeValue { get; set; }
}

public class ClassA
{
    public void ExecuteAction(ClassAParams executeParams) {}
}

ユニットテストを作成する別のクラス(ClassBと呼びましょう)があるとします。ClassB.Execute()が呼び出されたときに、そのClassBを確認します。 ClassA.ExecuteAction()を呼び出しますが、そのメソッドを呼び出すパラメーターがClassAParams.RequestedIdの値が1であることを確認します。

通常は、myMock.Verify(x => x.ExecuteAction(new ClassAParams { RequestedId = 1, SomeValue = "something" }));を実行してこれを処理します

問題は、この単体テストでSomeValueパラメータまたは他のClassAParamsプロパティの値を確認したくないことです。他のプロパティは他の単体テストでチェックされますが、すべての単体テストで正しいプロパティを使用して呼び出されていることを確認する必要がある場合(特定の単体テストのスコープを気にしない場合でも)は、ユニットのメンテナンスが面倒になります。

Moqを使用して、モックされたメソッドに渡される構造に、特定の値として特定のプロパティのみがあり、残りを無視することを確認する方法はありますか?

40
KallDrexx

mock.Verifyにはオーバーロードがあり、何かをテストできます。これは、テストに役立つはずの例です。

classA.Verify(
    a => a.ExecuteAction(
        It.Is<ClassAParams>(p => p.RequestedId == 12)
    )
);

つまり、"ClassAParamsが引数として渡された場合、RequestIdが12に等しいことを確認します"です。

70
SandRock