आप नहीं कर सकते - अगर इकाई परीक्षण का मतलब है कि आप स्मृति में नकली भंडार का उपयोग कर रहे हैं और इसलिए आप LINQ से ऑब्जेक्ट्स का उपयोग कर रहे हैं। यदि आप LINQ से ऑब्जेक्ट्स के साथ अपने प्रश्नों का परीक्षण करते हैं तो आपने अपने आवेदन का परीक्षण नहीं किया बल्कि केवल आपके नकली भंडार का परीक्षण किया।
आपका अपवाद कम खतरनाक मामला है क्योंकि यह इंगित करता है कि आपके पास लाल परीक्षण है, लेकिन संभवतः वास्तव में एक कार्यरत अनुप्रयोग है।
अधिक खतरनाक मामला दूसरी तरफ है: एक हरा परीक्षण होने पर एक क्रैशिंग एप्लिकेशन या प्रश्न जो आपके परीक्षण के समान परिणाम नहीं लौटाते हैं। जैसे प्रश्नों ...
context.MyEntities.Where(e => MyBoolFunction(e)).ToList()
या
context.MyEntities.Select(e => new MyEntity { Name = e.Name }).ToList()
... अपने परीक्षण में ठीक काम करेगा, लेकिन नहीं LINQ के साथ अपने आवेदन में संस्थाओं के लिए।
एक क्वेरी की तरह ...
context.MyEntities.Where(e => e.Name == "abc").ToList()
... अलग-अलग परिणामों LINQ के साथ वस्तुओं के लिए LINQ से संस्थाओं को वापस आ जाएगी।
आप केवल एकीकरण परीक्षण के निर्माण से अपने प्रश्न में क्वेरी का परीक्षण कर सकते हैं जो आपके आवेदन के LINQ से Entities प्रदाता और वास्तविक डेटाबेस का उपयोग कर रहे हैं।
संपादित
आप अभी भी इकाई परीक्षण लिखने के लिए चाहते हैं, तो मुझे लगता है कि आप नकली चाहिए स्वयं क्वेरी या क्वेरी में कम से कम भाव पर। मैं कल्पना कर सकता है कि निम्नलिखित कोड की तर्ज पर कुछ काम कर सकते हैं:
Where
अभिव्यक्ति के लिए एक इंटरफेस बनाएँ:
public interface IEntityExpressions
{
Expression<Func<MyEntity, bool>> GetSearchByDateExpression(DateTime date);
// maybe more expressions which use EntityFunctions or SqlFunctions
}
आपके आवेदन के लिए एक कार्यान्वयन बनाएं ...
public class EntityExpressions : IEntityExpressions
{
public Expression<Func<MyEntity, bool>>
GetSearchByDateExpression(DateTime date)
{
return e => EntityFunctions.TruncateTime(e.Date) == date;
// Expression for LINQ to Entities, does not work with LINQ to Objects
}
}
...और अपने यूनिट परीक्षण परियोजना में एक दूसरे कार्यान्वयन:
public class MyClass
{
private readonly IEntityExpressions _entityExpressions;
public MyClass()
{
_entityExpressions = new EntityExpressions(); // "poor man's IOC"
}
public MyClass(IEntityExpressions entityExpressions)
{
_entityExpressions = entityExpressions;
}
// just an example, I don't know how exactly the context of your query is
public IQueryable<MyEntity> BuildQuery(IQueryable<MyEntity> query,
SearchOptions searchOptions)
{
if (searchOptions.Date.HasValue)
query = query.Where(_entityExpressions.GetSearchByDateExpression(
searchOptions.Date));
return query;
}
}
उपयोग पहले (डिफ़ॉल्ट):
public class FakeEntityExpressions : IEntityExpressions
{
public Expression<Func<MyEntity, bool>>
GetSearchByDateExpression(DateTime date)
{
return e => e.Date.Date == date;
// Expression for LINQ to Objects, does not work with LINQ to Entities
}
}
अपने वर्ग में जहां क्वेरी का उपयोग कर रहे हैं इस इंटरफेस के लिए एक निजी सदस्य और दो कंस्ट्रक्टर्स बनाने अपने आवेदन में निर्माता:
var myClass = new MyClass();
var searchOptions = new SearchOptions { Date = DateTime.Now.Date };
var query = myClass.BuildQuery(context.MyEntities, searchOptions);
var result = query.ToList(); // this is LINQ to Entities, queries database
अपने इकाई परीक्षण में FakeEntityExpressions
के साथ दूसरे निर्माता का उपयोग करें:
IEntityExpressions entityExpressions = new FakeEntityExpressions();
var myClass = new MyClass(entityExpressions);
var searchOptions = new SearchOptions { Date = DateTime.Now.Date };
var fakeList = new List<MyEntity> { new MyEntity { ... }, ... };
var query = myClass.BuildQuery(fakeList.AsQueryable(), searchOptions);
var result = query.ToList(); // this is LINQ to Objects, queries in memory
यदि आप निर्भरता इंजेक्शन कंटेनर का उपयोग कर रहे हैं तो आप IEntityExpressions
को कन्स्ट्रक्टर में उपयुक्त कार्यान्वयन इंजेक्शन करके इसका लाभ उठा सकते हैं और डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता नहीं है।
मैंने ऊपर दिए गए उदाहरण कोड का परीक्षण किया है और यह काम करता है।
मैं अपने उत्तर हटा दिया गया है, यह आपके लिए उपयोगी नहीं था। किसी तरह मुझे संदेह था कि मैं आपको कुछ नया नहीं बता रहा था। मुझे पता नहीं है कि यूनिट टेस्ट में अपनी क्वेरी से कैसे निपटना है, जब तक कि आपके यूनिट टेस्ट में एलटीओ-फ्रेंडली ('c => c.Date.Date == ...') लागू करने वाले इंटरफ़ेस के पीछे पूरी क्वेरी डाली न जाए। । – Slauma
क्या आप कृपया अपना उत्तर मिटा सकते हैं? मुझे लगता है कि यह काफी मान्य है और दूसरों की मदद कर सकता है ... –
विधि केवल एक जगह धारक है। जब लिंक से एंटिटी ट्रांसलेटर अभिव्यक्ति वृक्ष को संसाधित करता है यदि यह इस विधि को देखता है तो यह जानता है कि इसे डेटाबेस विशिष्ट निर्माण के साथ कैसे बदला जाए। इसलिए विधि में कोई कार्यान्वयन नहीं है लेकिन NotSupportedException फेंकता है। – Pawel