2012-11-16 11 views
5

मैं अपने जेनेरिक नियंत्रकों का परीक्षण करने के लिए एक सामान्य टेस्टक्लास बनाने की कोशिश कर रहा हूं। सब कुछ इस छोड़कर ठीक काम कर रहा है:अभिव्यक्ति <Func <T, bool>> इसके साथ। यह हमेशा सच है

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

मैं तो जैसे परीक्षण सेटअप करने के लिए कोशिश कर रहा हूँ: मैं इस तरह एक विधि है

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()); 

और इस तरह परीक्षण निष्पादित करें:

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

यह हमेशा एक नया टी लौट

क्या मेरा सेटअप गलत है?

+0

क्या आप परीक्षण कर रहे हैं? ऐसा लगता है कि आप वास्तव में भंडार लुकअप तर्क लागू करने के लिए नकली करना चाहते हैं। – fsimonazzi

उत्तर

8

आप उसी सटीक उदाहरण को वापस करने के लिए मोक को निर्देश दे रहे हैं (इस मामले में, new T()), किसी भी समय 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

'सिंगल() 'क्या करता है इसका मतलब है और इसमें [अधिभार] है (http://msdn.microsoft.com/en-us/library/bb534800.aspx) जो वास्तव में उस तर्क को लेता है। और यह शायद बेहतर है, क्योंकि अगर एक से अधिक मिलान करने वाली वस्तु है तो यह फेंक देगा। – svick

+0

हाँ, भविष्यवाणी अधिभार पर मेरी गलती। – HackedByChinese

संबंधित मुद्दे