मैंने अपने वर्तमान प्रोजेक्ट के लिए कुछ यूनिट टेस्ट लिखना शुरू किया। मैं वास्तव में हालांकि इसके साथ अनुभव नहीं है। मैं पहले "पूरी तरह से" इसे प्राप्त करना चाहता हूं, इसलिए मैं वर्तमान में न तो अपने आईओसी ढांचे का उपयोग कर रहा हूं और न ही मॉकिंग लाइब्रेरी का।
मैं सोच रहा था कि क्या यूनिट परीक्षणों में ऑब्जेक्ट्स कंस्ट्रक्टर्स को अशक्त तर्क प्रदान करने में कुछ गड़बड़ है। मुझे कुछ उदाहरण कोड प्रदान करते हैं:
public class CarRadio
{...}
public class Motor
{
public void SetSpeed(float speed){...}
}
public class Car
{
public Car(CarRadio carRadio, Motor motor){...}
}
public class SpeedLimit
{
public bool IsViolatedBy(Car car){...}
}
फिर भी एक और कार कोड उदाहरण (टीएम), केवल प्रश्न के लिए महत्वपूर्ण भागों तक कम हो गया। मैंने अब एक परीक्षा कुछ इस तरह लिखी:
public class SpeedLimitTest
{
public void TestSpeedLimit()
{
Motor motor = new Motor();
motor.SetSpeed(10f);
Car car = new Car(null, motor);
SpeedLimit speedLimit = new SpeedLimit();
Assert.IsTrue(speedLimit.IsViolatedBy(car));
}
}
परीक्षण ठीक चलता है। अपनी बात करने के लिए SpeedLimit
एक के Car
साथ की जरूरत Motor
है। यह बिल्कुल भी दिलचस्पी नहीं है CarRadio
, इसलिए मैंने इसके लिए अशक्तता प्रदान की।
मैं सोच रहा था कि एक वस्तु पूरी तरह से निर्मित किए बिना सही कार्यक्षमता प्रदान करती है, जो एसआरपी या एक कोड गंध का उल्लंघन है। मुझे यह अहसास है कि यह करता है, लेकिन यह भी speedLimit.IsViolatedBy(motor)
सही नहीं लगता है - एक गति सीमा का उल्लंघन कार द्वारा किया जाता है, मोटर नहीं। हो सकता है कि मुझे केवल यूनिट परीक्षणों बनाम काम करने वाले कोड के लिए एक अलग दृष्टिकोण की आवश्यकता है, क्योंकि पूरे इरादे केवल पूरे हिस्से का परीक्षण करना है।
क्या यूनिट के परीक्षण में अशक्त वस्तुओं का निर्माण एक कोड गंध है?
null
रेडियो के साथ , गति सीमा सही ढंग से गणना की जाती है। अब आप रेडियो के साथ गति सीमा को मान्य करने के लिए एक परीक्षण बनाना चाहते हैं ; बस इस मामले में व्यवहार अलग है ...
Motor
शायद बिल्कुल भी नहीं होना चाहिएspeed
। यह एक होना चाहिएthrottle
औरtorque
वर्तमान के आधार पर गणना करता हैrpm
औरthrottle
। यह कार का काम हैTransmission
कि इसे एक वर्तमान गति में एकीकृत करने के लिए उपयोग किया जाए, और इसेrpm
वापस सिग्नल में बदलने के लिएMotor
... लेकिन मुझे लगता है, आप यथार्थवाद के लिए वैसे भी इसमें नहीं थे, क्या आप थे?