2012-11-16 7 views
5

ジェネリックコントローラをテストするために汎用テストクラスを作成しようとしています。すべてはこの除き正常に動作している: 私はこのような方法があります:Expression <Func <T, bool>> It.IsAnyは常にtrueを返します

var Guids = new[] { Guid.NewGuid(), Guid.NewGuid() }; 
var items = Guids.Select(x => new T {Id = x}); 
var mock = new Mock<IRepository<T>>(); 
mock.Setup(m => m.GetSingle(
    It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(new T()); 

そして、このようなテストを実行します:

private T GetSingle(Expression<Func<T, bool>> expression) 

を私はセットアップにそうようなテストをしようとしています

var value = Repository.GetSingle(x=> x.Id == Guid.NewGuid()); 

このは常に新しいT.を返す

設定が間違っていますか?

+0

それはあなたがテストしていることは何ですか?リポジトリルックアップロジックを実際に実装するためには、私はあなたが模擬したいと思うようです。 – fsimonazzi

答えて

8

指定された式に関係なく、同じ正確なインスタンス(この場合はnew T())を返すようにMoqに指示します。GetSingleが呼び出されます。あなたが実際に望むのは、それがitemsに対してその式を呼び出すことです:

mock.Setup(m => m.GetSingle(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns<Expression<Func<T, bool>>>(expression => items.AsQueryable().Single(expression)); 
+0

ありがとうございました!私はこれでしばらくの間作業していましたが、うまく動作しませんでした。私はこれをかなり新しくしました。私が改善するのを助けてくれてありがとう! –

+1

'Single()'は、意味することを行い、まさにその引数をとる[overload](http://msdn.microsoft.com/en-us/library/bb534800.aspx)を持っています。それは、複数の一致する項目がある場合にはスローされるので、おそらくより良いでしょう。 – svick

+0

ええ、私の過ちは過負荷です。 – HackedByChinese

関連する問題