コーヒー飲みながら仕事したい

仕事で使う技術的なことの備忘録とか


Wordpress に引っ越しました!

moq でデリゲートをモックする方法

移転しました。

Func<XXX> といったようなデリゲートをモックしたい時があります。
これを、 moq を使用する方法です。

やり方

たとえば、int 型を2つ受け取り、文字列に変換するデリゲートがあったとします。(つまり、 Func<int, int, string>
これをモックする方法は、以下の通りです。

var mock = new Mock<Func<int, int, string>>();

mock.Setup(m => m(It.IsAny<int>(), It.IsAny<int>())).Returns("モックする文字列");

ポイントは、 Invoke を使用しないことです。

例えば以下のようにやるとエラーになります。

var mock = new Mock<Func<int, int, string>>();

// これはエラー!System.InvalidCastException: Unable to cast object of type ‘System.Linq.Expressions.InstanceMethodCallExpressionN’ to type ‘System.Linq.Expressions.InvocationExpression’. とかいって怒られる!
mock.Setup(m => m.Invoke(It.IsAny<int>(), It.IsAny<int>())).Returns("モックする文字列");

参考元

dogschasingsquirrels.com