मैं भंडार पैटर्न का उपयोग करें और एक डमी भंडार है कि प्रश्न में इकाई परीक्षण द्वारा instantiated रहा है, यह डेटा का एक ज्ञात सेट है कि एक उदाहरण है कि दोनों के भीतर और विभिन्न क्षेत्रों के लिए सीमा से बाहर हैं शामिल हैं प्रदान करता है।
इसका मतलब है कि मैं टेस्ट यूनिट से परीक्षण इकाई या रनटाइम पर उत्पादन भंडार (निर्भरता इंजेक्शन (कैसल) के माध्यम से तत्काल भंडार की आपूर्ति करके अपरिवर्तित मेरे कोड का परीक्षण कर सकता हूं।
मुझे इसके लिए एक अच्छा वेब संदर्भ नहीं पता है, लेकिन मैंने अप्रेस द्वारा प्रकाशित स्टीवन सैंडर्सन की व्यावसायिक एएसपी.नेट एमवीसी 1.0 पुस्तक से बहुत कुछ सीखा। एमवीसी दृष्टिकोण स्वाभाविक रूप से चिंता का अलगाव प्रदान करता है जो आपके परीक्षण को कम निर्भरताओं के साथ संचालित करने के लिए आवश्यक है।
बुनियादी तत्व यह है कि आप भंडार डेटा एक्सेस के लिए एक इंटरफ़ेस लागू करते हैं, उसी इंटरफ़ेस को तब आपके नकली भंडार द्वारा कार्यान्वित किया जाता है जिसे आप अपनी परीक्षण प्रोजेक्ट में बनाते हैं।
मेरे वर्तमान परियोजना में मैं इस प्रकार एक अंतरफलक है:
namespace myProject.Abstract
{
public interface ISeriesRepository
{
IQueryable<Series> Series { get; }
}
}
यह दोनों मेरे लाइव डाटा भंडार (एसक्यूएल को LINQ का उपयोग) के रूप में कार्यान्वित किया जाता है और यह भी इस तरह एक नकली भंडार:
namespace myProject.Tests.Respository
{
class FakeRepository : ISeriesRepository
{
private static IQueryable<Series> fakeSeries = new List<Series> {
new Series { id = 1, name = "Series1", openingDate = new DateTime(2001,1,1) },
new Series { id = 2, name = "Series2", openingDate = new DateTime(2002,1,30),
...
new Series { id = 10, name = "Series10", openingDate = new DateTime(2001,5,5)
}.AsQueryable();
public IQueryable<Series> Series
{
get { return fakeSeries; }
}
}
}
फिर डेटा का उपभोग करने वाला वर्ग कन्स्ट्रक्टर को रिपोजिटरी संदर्भ पास करने के लिए तत्काल है:
namespace myProject
{
public class SeriesProcessor
{
private ISeriesRepository seriesRepository;
public void SeriesProcessor(ISeriesRepository seriesRepository)
{
this.seriesRepository = seriesRepository;
}
public IQueryable<Series> GetCurrentSeries()
{
return from s in seriesRepository.Series
where s.openingDate.Date <= DateTime.Now.Date
select s;
}
}
}
तब मेरे परीक्षण में मैं इसे इस प्रकार से संपर्क कर सकता:
namespace myProject.Tests
{
[TestClass]
public class SeriesTests
{
[TestMethod]
public void Meaningful_Test_Name()
{
// Arrange
SeriesProcessor processor = new SeriesProcessor(new FakeRepository());
// Act
IQueryable<Series> currentSeries = processor.GetCurrentSeries();
// Assert
Assert.AreEqual(currentSeries.Count(), 10);
}
}
}
फिर अपने उत्पादन कोड स्वचालित रूप से निर्भरता इंजेक्शन के माध्यम से अपने लाइव भंडार का दृष्टांत देने के लिए अपनी लाइव परियोजना के लिए नियंत्रण दृष्टिकोण का प्रतिलोम के लिए CastleWindsor को देखो। आपको उस स्थान के करीब जाना चाहिए जहां आपको होना चाहिए।
एक दिलचस्प दृष्टिकोण की तरह लगता है, लेकिन किसी भी तरह से मैं इसे पूरी तरह से समझ नहीं पा रहा हूं। क्या आपके पास इस दृष्टिकोण के लिए वेब पर कोई संदर्भ है? – Michal