मैं एक अच्छा PHP प्रोग्रामर जैसे यूनिट टेस्ट में एक अच्छा छोटा प्रोग्रामर की कोशिश कर रहा हूं, और मैं इसे सही तरीके से करना चाहता हूं। जो मैंने सुना है, उससे आपको एक विधि का सार्वजनिक इंटरफ़ेस है, लेकिन मैं सोच रहा था कि क्या वह अभी भी नीचे लागू होगा।यूनिट परीक्षण के साथ मुझे कितनी दूर जाना चाहिए?
मेरे पास एक तरीका है जो उपयोगकर्ता द्वारा अपना पासवर्ड भूल जाने पर एक पासवर्ड रीसेट टोकन उत्पन्न करता है। विधि दो चीजों में से एक लौटाती है: कुछ भी नहीं (शून्य) अगर सबकुछ ठीक काम करता है, या एक त्रुटि कोड यह दर्शाता है कि निर्दिष्ट उपयोगकर्ता नाम वाला उपयोगकर्ता मौजूद नहीं है।
यदि मैं केवल सार्वजनिक इंटरफ़ेस का परीक्षण कर रहा हूं, तो मैं कैसे सुनिश्चित कर सकता हूं कि पासवर्ड रीसेट टोकन डेटाबेस में जा रहा है यदि उपयोगकर्ता नाम मान्य है, और यदि उपयोगकर्ता नाम मान्य नहीं है तो डेटाबेस में नहीं जा रहा है? क्या मुझे यह सत्यापित करने के लिए अपने परीक्षणों में प्रश्न पूछना चाहिए? या क्या मुझे लगता है कि मेरा तर्क अच्छा है?
अब यह विधि बहुत सरल है और यह एक सौदा का बड़ा नहीं है - समस्या यह है कि यह वही स्थिति कई अन्य तरीकों पर लागू होती है। डेटाबेस केंद्रित यूनिट परीक्षणों में आप क्या करते हैं?
कोड, संदर्भ के लिए आवश्यक है, तो:
public function generatePasswordReset($username)
{
$this->sql='SELECT id
FROM users
WHERE username = :username';
$this->addParam(':username', $username);
$user=$this->query()->fetch();
if (!$user)
return self::$E_USER_DOESNT_EXIST;
else
{
$code=md5(uniqid());
$this->addParams(array(':uid' => $user['id'],
':code' => $code,
':duration' => 24 //in hours, how long reset is valid
));
//generate new code, delete old one if present
$this->sql ='DELETE FROM password_resets WHERE user_id=:uid;';
$this->sql.="INSERT INTO password_resets (user_id, code, expires)
VALUES (:uid, :code, now() + interval ':duration hours')";
$this->execute();
}
}
कम से कम मेरे लिए यूनिट परीक्षण के बारे में सबसे अच्छी बात यह है कि यह आपको दिखाता है कि आपको रिफैक्टर करने की आवश्यकता है। यह हाइलाइट निर्भरताओं में भी मदद करता है। मैं सुझाव दूंगा कि आपका 'चयन' और आपका 'हटाएं + INSERT' को अपने स्वयं के तरीकों से दोबारा संशोधित किया जाना चाहिए, जो कि पासवर्ड पीढ़ी अपने –
@pcampbell में होनी चाहिए - आपकी टिप्पणी एक उत्तर होना चाहिए –