頭を包むのに面白い問題があります。Moqを使って `object.Equals(object obj)`をモックする方法
public interface IMyThing
{
int Id { get; }
}
ここで、このインターフェイスを使用するコードをテストしたいと思います。たぶんLINQの魔法のあるもの。このような何か:
public class SomeClass
{
private IMyThing _thing;
...
public bool HasThing(IEnumerable<IMyThing> things)
{
return things.Contains(_thing);
}
}
私はMoq
を使用してIMyThing
を実装するすべてのオブジェクトをからかっている:ここで
public static IMyThing MockMyThing(int newId)
{
var mock = new Mock<IMyThing>();
mock.Setup(s => s.Id).Returns(newId);
mock.Setup(s => s.Equals(It.IsAny<object>())).Returns<object>(obj =>
{
if (typeof(IMyThing).IsAssignableFrom(obj.GetType()))
{
return ((IMyThing)obj).Id == newId;
}
return false;
});
return mock.Object;
}
事です。上記のコードは警告なしでコンパイルされますが、決して動作しません。 Moq
は、Equals()
メソッドのインターセプタを作成しますが、決して到達しません。代わりに、オブジェクトプロキシのequalsメソッドが呼び出されます。私はインターフェイスを嘲笑しているが、具体的なクラスではないという事実を非難している。
更新:ちょうど実現したMoq
は、インターセプタも作成しません。
もちろん私はこのようなIMyThing
インタフェースを拡張することができます:
public interface IMyThing : IEquatable<IMyThing>
{
int Id { get; }
}
LINQ演算子はIEquatable<T>
インターフェイスを認識し、それを使用します。
:私は私のモデルを汚染チェックしたくない
- これは
IEquatable<T>
は、この目的の- のためのものではなかった他の
IMyThing
オブジェクトでのみ使用可能ですそれを嘲笑させるだけです
あなたはこれをどのように解決しますか?
'HasThing()'メソッド中にいくつかの複雑なシナリオをテストしようとしているなら、おそらく 'IEnumerable'を受け入れるべきです。 「間接的なレベルのインダイレクション」を導入してみませんか? –