2011-01-14 13 views
1

私の汎用クラスは、コンストラクタでFunc <T>パラメータを受け取り、基本的にコンストラクタパラメータを呼び出すメソッドの1つをテストしたいと思います。
私は部品番号を使用して、私のテストコードでは、このようなものです:私のFuncを確認する方法

[Fact] 
public void Construct_EnsureInvokeFunction() 
{ 
    _objectToTest=new TypeToTest<T>(It.IsAny<Func<T>>()); 
    _objectToTest.Construct(); 
    //here I want to ensure that the passed parameter is invoked 
    //however since I can't mock Func<T>, I dont know how to verify 
    //whether Invoke method of Func<T> is triggered 
} 

一つ私が考えることができる回避策は、新しいインターフェースの内側に私のFunc <T>をラップし、それはInvokeメソッドだラップするメソッドを作成することですMoqを使用してインタフェースをモックします。しかしそれは効果的ではないようです。

何か不足していますか?任意のアイデアが評価されます。

おかげで、

アントン

答えて

2

あなたは副作用でシンプルなフェイクFunc<T>閉鎖を作成し、それらの副作用を確認することができます。ローカル変数をインクリメントするのは、必要以上に呼び出されていないことを宣言できるためです。このような何か:

int counter = 0; 
Func<T> f =() => { counter++; return fakeT; } 
var objectToTest = new TypeToTest<T>(f); 
objectToTest.Construct(); 
Assert.Equal(1, counter); 
2

あなたはローカル変数を設定し、匿名メソッドでFunc<T>をラップすることができます

bool wasInvoked = false; 
Func<T> testFunc =() => { var ret = funcToTest(); wasInvoked = true; return ret; } 

// Test something with testFunc instead of funcToTest 
... 

Assert.IsTrue(wasInvoked); 
+0

おかげで、あなたの答えは正しいですが、マルティーニの答えは最初に来ました。 –

関連する問題