背景
引数に条件式(Expression)を取るメソッドをMoqにSetupしようとした際に少しハマったのでメモ。
環境
- IDE:Visual Studio Community 2019 Ver.16.8.2
- .NET Version:Core 3.1
- 言語:C#
- TestFramework:xUnit 2.4.1
- Moq Version:4.15.2
Moqについて
Moqとは
Moqは. Net用の模擬ライブラリです。 ユニットテストを容易にするために、依存関係との対話をシミュレートして検証することができます。 — moq Tutorial => Getting started with moq
Moq Github
Quickstart · devlooped/moq Wiki
本題
たとえばこのようなUserクラスがあります。
そしてこのような条件式を引数に取るメソッドがあります。
このメソッドをMoqにSetupで追加するにはこのように書く。
ただこれだとIt.IsAny()を使用しているため、どのような条件でも返す値は同じとなります。
It.Is()で条件によって異なる値を返せないかやってみると、
インテリセンスも効くし普通に書けますが、「Ageの定義が含まれていない」と怒られます。 理由としては、Moqが式の等価の評価を実装していないから。
ではどうするかというと、Returnsの中に条件を書く。
以上で解決。
参考サイト