2011-10-10 8 views
61

複数の引数を持つ関数でラムダを使用する傾向がありますが、mock.Object.Convert(value, null, null, null);行をコールしようとすると実行時にこの例外がスローされます。Moq +ユニットテスト - System.Reflection.TargetParameterCountException:パラメータの数が一致しません

System.Reflection.TargetParameterCountException: Parameter count mismatch

コードは次のとおりです。

var mock = new Mock<IValueConverter>(); 

mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(), 
    It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5); 

var value = 5; 
var expected = 10; 
var actual = mock.Object.Convert(value, null, null, null); 

それを実装するための適切な方法は何ですか?あなたがnullを渡しているが、It.IsAny<Object>()がどのobjectnull除いを期待しているので、

答えて

108

それはあなたのReturns句です。設定している4つのパラメータメソッドがありますが、1つのパラメータのラムダのみを使用しています。私は問題なしで以下を実行した:

[TestMethod] 
public void IValueConverter() 
{ 
    var myStub = new Mock<IValueConverter>(); 
    myStub.Setup(conv => conv.Convert(It.IsAny<object>(), It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<CultureInfo>())). 
     Returns((object one, Type two, object three, CultureInfo four) => (int)one + 5); 

    var value = 5; 
    var expected = 10; 

    var actual = myStub.Object.Convert(value, null, null, null); 

    Assert.AreEqual<int>(expected, (int) actual); 
} 

例外はありません。

+0

私はこれがフレームワークのテストかどうかを調べるつもりでしたが、モックが正しく動作するようにするための中間コードである可能性は疑いの余地がありました。 –

+0

私はそれもそうだと思っていますが、とにかく私を笑わせてくれました。 –

+0

私は聞いています。コードを実行したとき、私は「うん、フレームワークライブラリはまだ動作している」と思った。 :) –

2

多分それはですか?あなたは?:以下

これは私からの暗闇の中でただ刺しある
var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture); 

、私はRhino.Mocksに精通していません場合はどうなります。


私の第二の推測:

は、ダウンロードが付属していますMoq.chmを見た、

あなたはコールのために嘲笑タイプの設定を指定し、」Setup(Expression<Action<T>>)方法を使用しています方法voidに。

Setup<TResult>(Expression<Func<T,TResult>>)メソッドは、値返すメソッドへの呼び出しのための模擬型の設定を指定します。

だからあなたが試みることができる:

mock.Setup<Int32>(
    conv => { 
     conv.Convert(
      It.IsAny<Object>(), 
      It.IsAny<Type>(), 
      It.IsAny<Object>(), 
      It.IsAny<CultureInfo>()); 
     return num + 5; 
     }); 
+0

mock.Setup は、ConvertメソッドがObjectを返すため、戻り値の型をObjectとして推測します。 –

4

ないOPためおそらく将来のGooglerのための答え:

私はこれは、いくつかのリファクタリングの結果だったと方法という設定

Mock 
    .Setup(r => r.GetNextCustomerNumber(It.IsAny<int>())) 
    .Returns(AccountCounter++) 
    .Callback<string, int>(badStringParam, leadingDigit => 
    { 
     // Doing stuff here, note that the 'GetNextCustomerNumber' signature is a single int 
     // but the callback unreasonably expects an additional string parameter. 
    }); 

の署名と一致しませんでしたCallbackを持っていましたリファクタリングツールはもちろん、Callbackの署名が正しくないことを認識できませんでした。

+0

うわー、私はこの同じ問題に対して私の頭を叩いていたし、私はあなたの記事を読むまでコールバック以上の光沢を維持してください。大変参考になったと思います。 – dblood

1

私の場合、Returns<>の型は出力型ですが、実際は入力型と考えました。

ですから、法

public virtual string Foo(int a, int b) { ... } 

を持っている場合は、正しい句は、私が最初に考えたものである、.Returns<string>(...).Returns<int, int>(...)ではありません。

最初は同じ入力と戻り値の型を持つ関数をテストしていたので、間違いでした。例えばpublic virtual string Foo(string a)です。

関連する問題