2012-02-10 3 views
1

デリゲートをパラメーターとして取り、UnsupportedExceptionを取得するメソッドをテストする必要があるまで、私は非常に満足していました。問題はhereとMoq issue listにも記載されています。デリゲートをパラメーターとして使用してメソッドをモックすることをサポートするモックフレームワーク

このような模倣をサポートするフレームワークはありますか?例えば

/// 
/// Interfaces 
/// 

public interface IChannelFactory<T> { 
    TReturn UseService<TReturn>(Func<T, TReturn> function); 
} 

public interface IService { 
    int Calculate(int i); 
} 

/// 
/// Test 
/// 

Mock<IChannelFactory<IService>> mock = new Mock<IChannelFactory<IService>>(); 

// This line results in UnsupportedException 
mock.Setup(x => x.UseService(service => service.Calculate(It.IsAny<int>()))).Returns(10); 
+0

実際のコードですか、それともサンプルの断片ですか?それは完全に指定されていないので私は尋ねる。たとえば、モックを作成するときに、そこに汎用レベルの別のレベルがあるべきではありませんか? '新しいモック>'? –

+0

ああ、訂正してくれてありがとう。コピー・ペーストではないため、エラーです。 – henginy

+0

セットアップラインで式(service => service.Calculate())を渡します。解決するものは、Func <>オブジェクトなどのデリゲートに渡す必要があります。 – IanNorton

答えて

3

私はあなたが何をしようとしてはかなりわからないんだけど、これはコンパイルされ、部品番号4であなたのインターフェースを使用して実行されます:

var mock = new Mock<IChannelFactory<IService>>(); 

mock.Setup(x => x.UseService(It.IsAny<Func<IService, int>>())).Returns(10); 

int result = mock.Object.UseService(x => 0); 

Console.WriteLine(result); // prints 10 

は、より複雑なケースのためにもthis answer参照してください。 。

+0

ありがとうございますが、これはUseServiceのメソッド呼び出し用のモックを設定しますが、特定のものを選択しようとしています。私はすぐにリンクの答えをチェックするつもりです。 – henginy

+0

リンクされた答えはおそらくあなたが望むものを得るでしょう。私は、一度に1つのことをテストしたいと思うことに注意します。これは通常、あなたのモックとスタブを簡単に保つことを意味します。もっと複雑にするほど、あなたのモックをテストしています。 – TrueWill

0

は、ほくろを見てください。それはモックとしてデリゲートをサポートします。

Moles

1

最近同じ問題が発生しました。moq(v4.0.10827)を使用して正しいメソッドとパラメータをテストする方法があります。 (ヒント:モックの2つのレイヤーが必要です)

//setup test input 
int testInput = 1; 
int someOutput = 10; 

//Setup the service to expect a specific call with specific input 
//output is irrelevant, because we won't be comparing it to anything 
Mock<IService> mockService = new Mock<IService>(MockBehavior.Strict); 
mockService.Setup(x => x.Calculate(testInput)).Returns(someOutput).Verifiable(); 

//Setup the factory to pass requests through to our mocked IService 
//This uses a lambda expression in the return statement to call whatever delegate you provide on the IService mock 
Mock<IChannelFactory<IService>> mockFactory = new Mock<IChannelFactory<IService>>(MockBehavior.Strict); 
mockFactory.Setup(x => x.UseService(It.IsAny<Func<IService, int>>())).Returns((Func<IService, int> serviceCall) => serviceCall(mockService.Object)).Verifiable(); 

//Instantiate the object you're testing, and pass in the IChannelFactory 
//then call whatever method that's being covered by the test 
// 
//var target = new object(mockFactory.Object); 
//target.targetMethod(testInput); 

//verifying the mocks is all that's needed for this unit test 
//unless the value returned by the IService method is used for something 
mockFactory.Verify(); 
mockService.Verify(); 
+0

それは面白いです!ありがとう、私はそれを試してみるつもりです。 – henginy

関連する問題