リポジトリを利用するクラスで、データ更新行うメソッド void Update(int Id, int quantity) (キーが Id のレコードの hoge 数値フィールドに quantity の値を加算する)について、hoge 数値フィールドに quantity の値が加算された数値で更新が行われることをテストする場合、リポジトリの更新メソッド呼び出しの引数をチェックすることが考えられます。ただし、本物のリポジトリを呼び出すと DB が更新されてしまうので、モック・ライブラリを利用しますよね。モック・ライブラリの一つである Moq を利用した場合、モックインスタンス.VerifyAll() メソッドでメソッドの呼び出しと引数の確認が行えますが、引数がクラスの場合、参照するインスタンスについての比較になってしまうので、何もしなければ引数のインスタンスと比較用のインスタンスは別物ということで、検証失敗になります。
これを回避するため、比較用のインスタンスを Equals メソッドをオーバーライドしたクラスから生成させ、比較するプロパティをリフレクションを用いることで、明示的に指定しないようにしてみました(モデルを変更した時のテストコードの比較部分の更新し忘れ対策 😛 )。
続きを読む リポジトリを利用するクラスに対する Moq を利用したメソッドの引数のテスト