के साथ यूनिट टेस्ट ईएफ रिपोजिटरी पैटर्न मैंने अपने आवेदन में यूनिट परीक्षण लिखना शुरू करने का निर्णय लिया। यह एक भंडार पैटर्न के साथ इकाई फ्रेमवर्क का उपयोग करता है।मोक
अब मैं रिपॉजिटरीज़ का उपयोग कर रहे तर्क वर्गों का परीक्षण शुरू करना चाहता हूं। मैं यहां एक साधारण उदाहरण प्रदान करता हूं।
public class GenericRepository : IRepository
{
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return Context.CreateQuery<TEntity>(entityName);
}
private string GetEntityName<TEntity>() where TEntity : class
{
return typeof(TEntity).Name;
}
public IEnumerable<TEntity> Find<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
return GetQuery<TEntity>().Where(predicate).AsEnumerable();
}
}
एक साधारण तर्क अवरोही क्रम में एक कैलेंडर तालिका से अलग वर्षों के लौटने वर्ग (हाँ मैं शब्द कैलेंडर हमारे कोड में गलत लिखा गया है पता है):
वर्ग GenericRepository में मेरी विधियों में से तीन
[TestFixture]
public class GetDistinctYearsFromCalendarTest
{
[Test]
public void ReturnsDistinctDatesInCorrectOrder()
{
var repositoryMock = new Mock<IRepository>();
repositoryMock.Setup(r => r.Find<Calender_Tbl>(c => c.Year.HasValue)).Returns(new List<Calender_Tbl>
{
new Calender_Tbl
{
Date =
new DateTime(2010, 1, 1),
Year = 2010
},
new Calender_Tbl
{
Date =
new DateTime(2010, 2, 1),
Year = 2010
},
new Calender_Tbl
{
Date =
new DateTime(2011, 1, 1),
Year = 2011
}
}.AsQueryable());
var getDistinct = new GetDistinctYearsFromCalendar(repositoryMock.Object).Get();
Assert.AreEqual(2, getDistinct.Count(), "Returns more years than distinct.");
Assert.AreEqual(2011, getDistinct[0], "Incorrect order, latest years not first.");
Assert.AreEqual(2010, getDistinct[1], "Wrong year.");
}
}
यह:
public class GetDistinctYearsFromCalendar
{
private readonly IRepository _repository;
public GetDistinctYearsFromCalendar()
{
_repository = new GenericRepository();
}
internal GetDistinctYearsFromCalendar(IRepository repository)
{
_repository = repository;
}
public int[] Get()
{
return _repository.Find<Calender_Tbl>(c => c.Year.HasValue).Select(c => c.Year.Value).Distinct().OrderBy(c => c).Reverse().ToArray();
}
}
और यहाँ मेरा पहला परीक्षण है ठीक काम कर रहा है लेकिन यह वास्तव में मैं नहीं करना चाहता हूं। चूंकि मुझे विधि को सेटअप करना है मॉक ऑब्जेक्ट पर खोजें मुझे यह भी पता होना चाहिए कि यह मेरे तर्क वर्ग में कैसे कॉल किया जा रहा है। अगर मैं टीडीडी करना चाहता हूं तो मैं इस बारे में बात नहीं करना चाहता हूं। मैं बस इतना जानना चाहता हूं कि कौन सा कैलेंडर संस्थाएं मेरे भंडार प्रदान करनी चाहिए। मैं GetQuery विधि सेटअप करना चाहता हूँ। इस तरह:
repositoryMock.Setup(r => r.GetQuery<Calender_Tbl>()).Returns(new List<Calender_Tbl>
{
new Calender_Tbl
{
Date =
new DateTime(2010, 1, 1),
Year = 2010
},
new Calender_Tbl
{
Date =
new DateTime(2010, 2, 1),
Year = 2010
},
new Calender_Tbl
{
Date =
new DateTime(2011, 1, 1),
Year = 2011
}
}.AsQueryable());
तो जब ढूँढें GenericRepository वर्ग में आंतरिक रूप से GetQuery बुला रहा है यह सही कैलेंडर संस्थाओं है कि मैं GetQuery में सेटअप मिलना चाहिए। लेकिन यह निश्चित रूप से काम नहीं कर रहा है। चूंकि मैंने अपने नकली ऑब्जेक्ट की खोज विधि सेट नहीं की है, इसलिए मुझे कोई भी संस्था नहीं मिलती है।
तो क्या करना है? निस्संदेह मैं शायद मोल्स या कुछ अन्य ढांचे का उपयोग कर सकता हूं जो सबकुछ जोड़ता है लेकिन मैं ऐसा नहीं करना चाहता हूं। क्या इस मुद्दे को हल करने के लिए कक्षा या परीक्षण के डिजाइन में कुछ भी कर सकता हूं?
अगर मुझे अपने वर्तमान समाधान के साथ जाना है, तो यह दुनिया का अंत नहीं है, लेकिन क्या होगा यदि संपत्ति वर्ष शून्य नहीं हो पाता है? तो निश्चित रूप से मुझे तर्क वर्ग में अपना कार्यान्वयन बदलना होगा, लेकिन मुझे परीक्षा भी बदलनी होगी। मैं इससे बचने की कोशिश करना चाहता हूं।
public class MockRepository : IRepository
{
private List<object> entities;
public MockRepository(params object[] entitites)
{
this.entities = entities.ToList();
}
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
return this.entities.OfType<TEntity>().AsQueryable();
}
public IEnumerable<TEntity> Find<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
return GetQuery<TEntity>().Where(predicate).AsEnumerable();
}
}
कि सबसे आसान है और मेरे पसंदीदा तरीका:
मुझे लगता है कि ऐसा करने का एक तरीका है 'GetDistinctYearsFromCalendar' 'IRepository' पर निर्भर है। इस तरह आप 'जेनेरिक रिपोजिटरी' को 'GetDistinctYearsFromCalendar' को अलग-अलग परीक्षण कर सकते हैं। अधिक जानकारी के लिए http://en.wikipedia.org/wiki/Dependency_injection देखें। – Michael
ठीक है, मुझे आंतरिक सीटीआर नहीं मिला। क्या आपके पास एक ही प्रोजेक्ट में परीक्षण और उत्पादन कोड है? मुझे लगता है कि ऐसा करने का सही तरीका डिफ़ॉल्ट सीटीओ के माध्यम से सभी तरह से निर्भरता इंजेक्शन कर रहा है। – Michael
मुझे एहसास है कि मैं सिर्फ अपना तर्क लिख सकता हूं: वापसी _repository.GetQuery()। जहां (c => c.Year.HasValue)। चयन करें (c => c.Year.Value)। डिस्टिंट()। ऑर्डरबी (सी => सी)। रैवरसे()। ToArray(); नहीं, मैं किसी अन्य प्रोजेक्ट में परीक्षण करता हूं लेकिन असेंबली निर्देशों के साथ परीक्षण परियोजना में आंतरिक रूप से खुलासा करता हूं। लेकिन क्या होगा यदि मैं जेनेरिक रिपोजिटरी से किसी अन्य प्रकार का कभी भी उपयोग नहीं करता? क्या निर्भरता इंजेक्शन को हर तरह से करना आवश्यक है? यह सबसे अच्छा समाधान सही लगता है? मैं अंधेरा था और भंडार की सभी कार्यक्षमताओं का उपयोग करना चाहता था। –
John