मैं खुद को TDD दृष्टिकोण का उपयोग करना सिखाना चाहता था और मेरे पास एक परियोजना थी जिसे मैं थोड़ी देर के लिए काम करना चाहता था। यह एक बड़ी परियोजना नहीं थी इसलिए मुझे लगा कि यह टीडीडी के लिए एक अच्छा उम्मीदवार होगा। हालांकि, मुझे लगता है कि कुछ गड़बड़ हो गई है। मुझे एक उदाहरण देने दें:
उच्च स्तर पर मेरी परियोजना Microsoft OneNote के लिए एक ऐड-इन है जो मुझे प्रोजेक्ट्स को अधिक आसानी से ट्रैक और प्रबंधित करने की अनुमति देगा। अब, मैं इसके लिए व्यावसायिक तर्क भी रखना चाहता था क्योंकि OneNote से डिक्लेयुड होने की स्थिति में मैंने अपने कस्टम स्टोरेज का निर्माण करने का निर्णय लिया और किसी दिन वापस समाप्त कर दिया।
पहले मैंने एक बुनियादी सादे शब्दों को स्वीकार करने के लिए परीक्षण शुरू किया, जिसमें मैं यह बताना चाहता था कि मैं अपनी पहली विशेषता क्या करना चाहता हूं। यह कुछ इस तरह दिखता है (संक्षिप्तता के लिए इसे नीचे खींचना):
- उपयोगकर्ता क्लिक परियोजना बनाते हैं
- परियोजना के शीर्षक में उपयोगकर्ता प्रकार
- सत्यापित करें कि प्रोजेक्ट सही तरीके से बनाया गया है
UI सामान और कुछ मध्यस्थ योजना पर स्किप करना, मैं अपनी पहली इकाई परीक्षण के लिए आता हूं:
[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
var testController = new Controller();
Project newProject = testController(A.Dummy<String>());
Assert.IsNotNull(newProject);
}
अब तक सब ठीक है। लाल, हरा, रिफलेक्टर, आदि। अब यह वास्तव में सामान को बचाने की जरूरत है। यहाँ कुछ कदम काटकर मैं इसके साथ हवा हूँ।
[TestMethod]
public void CreateProject_BasicParameters_ProjectMatchesExpected()
{
var fakeDataStore = A.Fake<IDataStore>();
var testController = new Controller(fakeDataStore);
String expectedTitle = fixture.Create<String>("Title");
Project newProject = testController(expectedTitle);
Assert.AreEqual(expectedTitle, newProject.Title);
}
मैं अभी भी इस बिंदु पर अच्छा महसूस कर रहा हूं। मेरे पास अभी तक एक ठोस डेटा स्टोर नहीं है, लेकिन मैंने इंटरफ़ेस बनाया कि मैं यह कैसे अनुमान लगाऊंगा।
मैं यहाँ कुछ चरणों को छोड़ने जा रहा हूँ क्योंकि यह पोस्ट काफी लंबी हो रही है, लेकिन मैंने इसी तरह की प्रक्रियाओं का पालन किया है और आखिरकार मुझे अपने डेटा उत्पादों के लिए इस परीक्षण में शामिल होना चाहिए:
[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
/* snip init code */
testDataStore.SaveNewProject(A.Dummy<IProject>());
A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}
यह तब तक अच्छा था जब तक मैंने इसे लागू करने की कोशिश नहीं की:
public String SaveNewProject(IProject project)
{
Page projectPage = oneNoteInterop.CreatePage(...);
}
और वहाँ समस्या है जहाँ "..." है। मुझे लगता है कि इस बिंदु पर अब CreatePage को एक सेक्शन आईडी की आवश्यकता है। जब मैं नियंत्रक स्तर पर सोच रहा था तो मुझे इस बात का एहसास नहीं था क्योंकि मैं केवल नियंत्रक से संबंधित बिट्स के परीक्षण से संबंधित था। हालाँकि, यहाँ मुझे अब एहसास हुआ कि मुझे इस प्रोजेक्ट को स्टोर करने के लिए लोकेशन माँगनी होगी। अब मुझे डेटास्टोर में एक स्थान आईडी जोड़ना है, फिर एक परियोजना में जोड़ना है, फिर नियंत्रक में एक जोड़ना है, और उन सभी परीक्षणों में इसे जोड़ना है जो उन सभी चीजों के लिए पहले से ही लिखे गए हैं। यह बहुत जल्दी थकाऊ हो गया है और मैं मदद नहीं कर सकता, लेकिन ऐसा महसूस करता हूं कि मैंने इस तेज को पकड़ लिया होता अगर मैं टीडीडी प्रक्रिया के दौरान इसे डिजाइन करने की बजाय समय से पहले ही डिजाइन से बाहर निकाल देता।
क्या कोई मुझे समझा सकता है अगर मैंने इस प्रक्रिया में कुछ गलत किया हो? वहाँ वैसे भी इस तरह के refactoring से बचा जा सकता है? या यह आम है? यदि यह आम है तो क्या इसे और अधिक दर्द रहित बनाने के तरीके हैं?
सबको शुक्रीया!