यहां बताया गया है मैं (xUnit.net के साथ) इस तरह के एक कारखाने के लिए इकाई परीक्षण के एक जोड़े में से एक ने लिखा है:
[Fact]
public void CreateReturnsInstanceWithCorrectParam1()
{
var sut = new FooFactory();
var expected = new object();
var actual = sut.Create(expected, new object());
var concrete = Assert.IsAssignableFrom<Foo>(actual);
Assert.Equal(expected, concrete.Object1);
}
यह कैप्सूलीकरण तोड़ करता है? हाँ और नहीं ... थोड़ा सा। Encapsulation न केवल डेटा छिपाने के बारे में है - अधिक महत्वपूर्ण बात यह है कि यह लगभग protecting the invariants of objects है।
मान लेते हैं कि फू इस सार्वजनिक एपीआई को उजागर करता है:
public class Foo : IFoo
{
public Foo(object param1, object param2);
public void MethodDefinedByInterface();
public object Object1 { get; }
}
Object1
संपत्ति थोड़ा Law of Demeter का उल्लंघन है, ऐसा नहीं गड़बड़ वर्ग के अपरिवर्तनशीलताओं साथ है क्योंकि यह केवल पढ़ने के लिए है नहीं करता है।
इसके अलावा, Object1
संपत्ति ठोस फू वर्ग का हिस्सा है - नहीं IFoo इंटरफ़ेस:
public interface IFoo
{
void MethodDefinedByInterface();
}
एक बार जब आप महसूस करते हैं कि एक शिथिल युग्मित एपीआई, concrete members are implementation details में, इस तरह के ठोस-केवल केवल पढ़ने के गुण होते हैं encapsulation पर बहुत कम प्रभाव। इसके बारे में इस तरह सोचें:
सार्वजनिक फू निर्माता भी ठोस फू वर्ग के एपीआई का एक हिस्सा है, इसलिए सिर्फ सार्वजनिक एपीआई निरीक्षण के द्वारा, हम सीखते हैं कि param1
और param2
वर्ग का हिस्सा हैं। एक अर्थ में, यह पहले से ही 'encapsulation तोड़ता है', इसलिए कंक्रीट वर्ग पर केवल-पढ़ने वाले गुणों के रूप में उपलब्ध प्रत्येक पैरामीटर को बहुत अधिक नहीं बदलता है।
इस तरह के गुण लाभ प्रदान करते हैं कि अब हम कारखाने द्वारा लौटाए गए फू क्लास के संरचनात्मक आकार का परीक्षण कर सकते हैं।
व्यवहारिक इकाई परीक्षणों के एक सेट को दोहराने से कहीं अधिक आसान है, हमें यह मानना चाहिए कि पहले से ही कंक्रीट फू क्लास को कवर किया गया है। यह लगभग तार्किक सबूत की तरह है:
- कंक्रीट फू क्लास के परीक्षणों से हम जानते हैं कि यह अपने कन्स्ट्रक्टर पैरामीटर के साथ सही तरीके से उपयोग/इंटरैक्ट करता है।
- इन परीक्षणों से हम यह भी जानते हैं कि निर्माता पैरामीटर केवल पढ़ने-योग्य संपत्ति के रूप में सामने आया है।
- FooFactory के एक परीक्षण से हम जानते हैं कि यह कंक्रीट फू क्लास का एक उदाहरण देता है।
- इसके अलावा, हम निर्माण विधि के परीक्षणों से जानते हैं कि इसके पैरामीटर फ़ू कन्स्ट्रक्टर को सही ढंग से पास किए गए हैं।
- Q.E.D.
यूनिट परीक्षण परीक्षण किए जा रहे घटक पर कार्यात्मक आवश्यकता और अपेक्षाओं पर निर्भर होना चाहिए। मुझे यूनिट परीक्षण का कोई भी मूल्य नहीं दिखता है, जो शेष संदर्भ के बिना कक्षा है। – ivowiblo
@ivowiblo मुझे लगता है कि आप बीडीडी-शैली परीक्षणों के साथ यूनिट परीक्षणों को भ्रमित कर रहे हैं। यदि आप इस इकाई के लिए कोई परीक्षा नहीं लिखते हैं, तो आप कैसे जानते हैं कि यह काम करता है? –
इकाई परीक्षण करें, लेकिन आप परीक्षण करेंगे क्या? उस इकाई के लिए उम्मीद कौन सा है? मैंने कहा कि मुझे किसी और चीज के बिना उस वर्ग के यूनिट टेस्ट करने का मूल्य नहीं दिख रहा है। इकाई परीक्षण करने के कारण यूनिट परीक्षण करना बिल्कुल समझ में नहीं आता है। परीक्षण (इकाइयों, व्यवहार, पूर्ण कार्यक्षमताओं, जो भी आप चाहते हैं) हमेशा उम्मीदों और आवश्यकताओं से प्रेरित किया जाना चाहिए। यदि नहीं, तो यह सिर्फ स्नोबिज्म है (यदि वह शब्द मौजूद है)। – ivowiblo